Leetcode # 1644. Lowest Common Ancestor of a Binary Tree II
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-ii
Solution: DFS
Time Complexity: O(2 * len(tree)) = O(2 * len(tree))
Space Complexity: O(len(tree)) (The worst case is O(2 * len(tree)))
(The input and output generally do not count towards the space complexity.)
class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': stack = [[root, []]] p_ancestors = q_ancestors = None while stack: cur, ancestors = stack.pop() ancestors = ancestors.copy() + [cur] for child in [cur.left, cur.right]: if child: if child == p: p_ancestors = ancestors.copy() + [child] if child == q: q_ancestors = ancestors.copy() + [child] stack.append([child, ancestors]) if not p_ancestors or not q_ancestors: return None # print([node.val for node in p_ancestors]) # print([node.val for node in q_ancestors]) for i in range(min(len(p_ancestors), len(q_ancestors))): if p_ancestors[i] != q_ancestors[i]: return p_ancestors[i - 1] return p_ancestors[-1] if len(p_ancestors) < len(q_ancestors) else q_ancestors[-1]
Solution: DFS (Recursive)
Time Complexity: O(len(tree))
Space Complexity: O(len(tree))
(The input and output generally do not count towards the space complexity.)
class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': self.lca = None def dfs(_root, _p, _q): if self.lca: return 0 found = 0 if _root == _p and _root == _q: self.lca = _root return 0 if _root == _p: found += 1 if _root == _q: found += 1 for child in [_root.left, _root.right]: if child: found += dfs(child, _p, _q) if found == 2: self.lca = _root return 0 return found dfs(root, p, q) return self.lca
Last Updated on 2023/08/16 by A1go