Lowest Common Ancestor of a Binary Tree
Medium
TreeDFS
Problem
Given the root of a binary tree and two nodes p, q, return their lowest common ancestor (deepest node containing both in its subtree).
Example 1
Input: [3,5,1,6,2,0,8], p=5, q=1
Output: 3
Example 2
Input: [3,5,1,6,2,0,8], p=5, q=4
Output: 5
Constraints
- 2 ≤ nodes ≤ 10⁵
Approach — Tree Traversal
This is a Tree Traversal problem. The idea: traverse the tree — DFS recursively, or BFS level by level — and combine the results from each subtree. Work through the reference code below line by line, then re-derive it yourself in the editor — that's how the pattern sticks.
Complexity: O(n) time.
Solution code
Python
class Solution:
def lowestCommonAncestor(self, root, p, q):
if not root or root is p or root is q:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left and right:
return root
return left or right
Java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q) return root;
TreeNode L = lowestCommonAncestor(root.left, p, q);
TreeNode R = lowestCommonAncestor(root.right, p, q);
if (L != null && R != null) return root;
return L != null ? L : R;
}
}
Practice it
Reading a solution isn't the same as being able to write it under pressure. Open this problem in the in-browser editor, hide the solution, and solve it from scratch — your code runs against real test cases instantly.
Solve Lowest Common Ancestor of a Binary Tree interactively → ← All solutions