• 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。

  • 相关阅读:
    cocos2dx 3.x(获取当前系统时间)
    cocos2dx 3.x(加载cocostudio进度条)
    cocos2dx 3.x(Button传统按钮)
    cocos2dx 3.x以上(Sprite精灵类的相关属性与创建)
    cocos2dx 3.x版本搭建Mac环境工程(创建一个新的C++工程)百分百可行
    iOS
    iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)
    iOS -Swift 3.0 -String(字符串常规用法)
    iOS -Swift 3.0 -UIButton属性大全
    iOS -Swift 3.0 -UILabel属性大全
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5495540.html
Copyright © 2020-2023  润新知