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.

一道middle的binary tree的题目,在我的眼里不是非常简单,思路devide and conquer。即不断递归向下,找寻最低公共结点,如果某结点的左右的子树分别包括node1或者node2,则返回该结点。否则如果左子树中包括node1或者node2中的一个,则返回被命中的node,右结点也是。如果左右都没有,或者结点为空,则返回None.该题结点不会有重复,所以不同的结点不会同时等于node1或者node2。

另外一值得注意的地方是,如果要寻找的两个结点,其中一个结点为另外一个结点的子结点,则找到为母结点的那个结点就可以返回,毕竟结点相等,意味着该结点的左右子树也完全相等,即包含着那个子结点,因为程序递归向下,所以最终最终返回的是为母结点的那个点。最差情况下所有结点都需要遍历一遍,每个结点的处理时间为O(1),所以最坏的时间复杂度为O(n),平均时间复杂度为O(n)。空间复杂度为递归栈的大小,为O(logn)

代码如下:

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
在root为根的二叉树中找A,B的LCA:如果找到了就返回这个LCA如果只碰到A,就返回A如果只碰到B,就返回B如果都没有,就返回None

if root in (None,p,q): #node为空则返回空,node等于p或者q则返回该结点的值

        return root
        left = self.lowestCommonAncestor(root.left,p,q)
        right = self.lowestCommonAncestor(root.right,p,q)
        
        if left and right:
            return root
        if left:
            return left
        if right:
            return right
        return None   #左右结点都不包含要寻找的结点,且该结点本身也不是,则返回None

以下给出几个辅助理解的例子:

左边为找5,4的LCA,右边为找4,8的LCA。

 

posted on 2016-05-15 17:05  Sheryl Wang  阅读(194)  评论(0编辑  收藏  举报

导航