Skip to main content

Lowest Common Ancestor of a Binary Tree

LeetCode 236 | Difficulty: Medium​

Medium

Problem Description​

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: β€œThe lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

Example 1:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
Output: 3
Explanation: The LCA of nodes 5 and 1 is 3.

Example 2:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
Output: 5
Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

Example 3:

Input: root = [1,2], p = 1, q = 2
Output: 1

Constraints:

- The number of nodes in the tree is in the range `[2, 10^5]`.

- `-10^9 <= Node.val <= 10^9`

- All `Node.val` are **unique**.

- `p != q`

- `p` and `q` will exist in the tree.

Topics: Tree, Depth-First Search, Binary Tree


Approach​

Tree DFS​

Traverse the tree recursively (or with a stack). At each node, decide: what information do I need from the left/right subtrees? Process: go left β†’ go right β†’ combine results. Consider preorder, inorder, or postorder traversal based on when you need to process the node.

When to use

Path problems, subtree properties, tree structure manipulation.


Solutions​

Solution 1: C# (Best: 116 ms)​

MetricValue
Runtime116 ms
MemoryN/A
Date2018-04-25
Solution
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root==p || root==q) return root;
var leftLca = LowestCommonAncestor(root.left, p, q);
var rightLca = LowestCommonAncestor(root.right, p, q);
if(leftLca==null) return rightLca;
if(rightLca == null) return leftLca;
return root;
}
}
πŸ“œ 1 more C# submission(s)

Submission (2018-07-27) β€” 152 ms, N/A​

/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root==p || root==q) return root;
var leftLca = LowestCommonAncestor(root.left, p, q);
var rightLca = LowestCommonAncestor(root.right, p, q);
if(leftLca==null) return rightLca;
if(rightLca == null) return leftLca;
return root;
}
}

Complexity Analysis​

ApproachTimeSpace
Tree Traversal$O(n)$$O(h)$

Interview Tips​

Key Points
  • Discuss the brute force approach first, then optimize. Explain your thought process.
  • Consider: "What information do I need from each subtree?" β€” this defines your recursive return value.