[LeetCode] 236. Lowest Common Ancestor of a Binary Tree

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 v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
        _______3______
       /              \
    ___5__          ___1__
   /      \        /      \
   6      _2       0       8
         /  \
         7   4
For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

Thought process:
For each tree node, we recursively search its left subtree and right subtree for node 1 and node 2. There are four cases:
  1. SearchLeft and searchRight are both not null: one of the node is found in left subtree and the other is in right subtree. This means root is there LCA.
  2. SearchLeft is not null and searchRight is null: both nodes are in the left subtree. SearchLeft is their LCA.
  3. SearchLeft is null and searchRight is not null: both nodes are in the right subtree. SearchRight is their LCA.
  4. Both searchLeft and searchRight are null: neither node is found. Continue searching in a higher level.

Solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     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;
        }
        
        TreeNode searchLeft = lowestCommonAncestor(root.left, p, q);
        TreeNode searchRight = lowestCommonAncestor(root.right, p, q);
        
        if (searchLeft != null && searchRight != null) {
            return root;
        } else if (searchLeft != null) {
            return searchLeft;
        } else if (searchRight != null) {
            return searchRight;
        } else {
            return null;
        }
    }
}

Time complexity: O(n).

Comments

Popular posts from this blog

[LeetCode] 714. Best Time to Buy and Sell Stock with Transaction Fee

[LeetCode] 269. Alien Dictionary

[LeetCode] 410. Split Array Largest Sum