Premiumlab  

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

 

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

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).”

        _______6______
       /              \
    ___2__          ___8__
   /      \        /      \
   0      _4       7       9
         /  \
         3   5

For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

 

Hint:

There are four relationships of subnodes p, q and root node root. 

 

1) Two subnodes are on the left subtree. (see node 1, 4)

2) Two subnodes are on the right subtree. (see node 7, 9)

3) One subnode is on the left subtree while another is on the right subtree. (see node 1, 7)

4) The value of one subnode is euqal to the value of root node.  (see node 2, 4)

 

 

Under scenario 1 and 2, the current node the most recent ancestor, while under scenario  2 and 4, recursion on the left or right tree is needed to find the LCA.

 

Time/Space complexity: O(h) where h is the height of the tree. 

 

Sol:

Iteration.

 

# 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):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
        while root:
            if min(q.val, p.val) > root.val:
                root = root.right
            elif max(q.val, p.val) < root.val:
                root = root.left
            else:
                return root
        return None

 

 

Note:

 

1 If both values of sub nodes are greater than the value of the root, the new root is the right child of the root. 

 

If both values of sub nodes are smaller than the value of the root, the new root is the left child of the root. 

 

2 Can not write "return" in front of root = root.right/left. This is a iterate process, do not return anything until the process is finished. 

 

 

Sol 2:

Recursion

 

# 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):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
        while root:
            if min(q.val, p.val) > root.val:
                return self.lowestCommonAncestor(root.right, p, q)
            elif max(q.val, p.val) < root.val:
                return self.lowestCommonAncestor(root.left, p, q)
            else:
                return root
        return None

 

 

Note:

 

1 Write "return" before calling the function. This is a recursive process, so following process replies on previous values. Do return values in each recursion.   

 

posted on 2017-06-06 14:02  Premiumlab  阅读(121)  评论(0编辑  收藏  举报