Leetcode 236: Lowest Common Ancestor of a Binary Tree

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/

Lowest Common Ancestor of a Binary Tree

Total Accepted: 17453 Total Submissions: 63885 Difficulty: Medium

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.

Code:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        if root is None:
            return None
        if root == p or root == q:       
            return root
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        if left and right:
            return root
        elif left:
            return left
        elif right:
            return right
        else:
            None

 

Idea:

lowestCommonAncestor will do the following judgement:

  1. if applying lowestCommonAncestor on root.left returns non-None value, it means at least p or q is in its left subtree.
  2. if appling lowestCommonAncestor on root.right returns non-None value, it means at least p or q is in its right subtree.
  3. if both root’s left and root’s right return non-None values, then p and q are in its left subtree and right subtree. So the common ancestor should be root. 
  4. if only one of root’s left and root’s right returns non-None value, that means both p and q is in that subtree. In this case, just return whichever non-None value you get.
  5. If lowestCommonAncestor returns none, that means neither p or q is in root and its subtrees.

 

Leave a comment

Your email address will not be published. Required fields are marked *