zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Suricata的输出
    Setting up IPS/inline for Linux in Suricata
    Suricata的初始化脚本
    Suricata的Reputation
    Suricata的配置
    Suricata的性能
    Suricata里的规则与Snort区别之处
    Suricata的命令行解释
    [转]ASP.NET 成员资格 Part.1(API)
    [转]ASP.NET MVC4+BootStrap 实战(一)
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5495540.html
Copyright © 2011-2022 走看看