Open seungriyou opened 8 months ago
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/
전형적인 LCA 문제. BST에 대한 LCA 문제는 #27 에서 풀어봤었다.
해당 문제와 다른 점은 BST가 아니기 때문에 모든 노드를 방문해야 한다는 점이다.
root
left
right
p
q
None
우선 모든 노드에 대해 부모 노드를 파악하고, p와 q 각각에서부터 root까지 올라가보면서 확인하는 것이 핵심이다.
parent
{노드: 부모 노드}
path
set()
O(n)
O(h)
Approach
전형적인 LCA 문제. BST에 대한 LCA 문제는 #27 에서 풀어봤었다.
해당 문제와 다른 점은 BST가 아니기 때문에 모든 노드를 방문해야 한다는 점이다.
Idea 1: Recursive
root
에서부터left
와right
에 대해 recursive 하게 내려가면서, 주어진p
와q
를 찾는다.left
와right
의 결과에 따라 반환한다.p
와q
가 각각left
와right
에 위치한다면, 현재root
가 LCA가 된다.p
와q
가 모두 한 쪽에 위치한다면,left
와right
중None
이 아닌 것이 LCA가 된다.Idea 2: Iterative 💡
우선 모든 노드에 대해 부모 노드를 파악하고,
p
와q
각각에서부터root
까지 올라가보면서 확인하는 것이 핵심이다.parent
table을 구성한다. ({노드: 부모 노드}
)p
부터root
까지 올라가면서 거치는 노드를path
라는set()
에 저장한다.q
부터root
까지 올라가면서,p
의path
에 속하는 노드를 마주치게 되면 멈추고 현재 노드를 반환한다.Complexity
O(n)
(모든 노드 방문) / (iter)O(n)
O(h)
(트리의 높이 만큼) / (iter)O(n)
(모든 노드에 대해parent
table 구성)