python--lintcode88. 最近公共祖先

标签: python leetcode 算法 lintcode
12人阅读 评论(0) 收藏 举报
分类:

给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。

最近公共祖先是两个节点的公共的祖先节点且具有最大深度。

 注意事项

假设给出的两个节点都在树中存在

样例

对于下面这棵二叉树

  4
 / \
3   7
   / \
  5   6

LCA(3, 5) = 4

LCA(5, 6) = 7

LCA(6, 7) = 7

LCA(最近公共父节点)问题是二叉树里很经典的问题了,若是树的结构中有parent指针的话那这一题就很容易了,若没有的话就需要想一想了。

依然用到了分治法的思想,想一想,若是对于一个树结点,在左子树中找到了A,在右子树中找到了B,那说明此结点是公共节点

详细思想写在代码注释里了:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None


class Solution:
    """
       @param: root: The root of the binary search tree.
       @param: A: A TreeNode in a Binary.
       @param: B: A TreeNode in a Binary.
       @return: Return the least common ancestor(LCA) of the two nodes.
       """

    def lowestCommonAncestor(self, root, A, B):
        # A&B=>LCA
        # !A&!B=>None
        # A&!B=>A
        # B&!A=>B
        if(root is None or root==A or root==B):
            return root        #若root为空或者root为A或者root为B,说明找到了A和B其中一个
        left=self.lowestCommonAncestor(root.left,A,B)
        right=self.lowestCommonAncestor(root.right,A,B)
        if(left is not None and right is not None):
            return root      #若左子树找到了A,右子树找到了B,说明此时的root就是公共祖先
        if(left is None):    #若左子树是none右子树不是,说明右子树找到了A或B
            return right
        if(right is None):   #同理
            return left
        return None



a=Tree = TreeNode(2)
b=Tree.left = TreeNode(1)
c=Tree.right = TreeNode(3)
d=b.left=TreeNode(4)
s = Solution()
print(s.lowestCommonAncestor(a,b,d).val)


查看评论

二叉树的最近公共祖先LCA

情况1: 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知。 如果该二叉树是二叉查找树,那么求解LCA十分简单。 基本思想为:从树根开始,该节点的值为t, 如果t...
  • study_000
  • study_000
  • 2017-08-22 18:10:58
  • 282

lintcode-最近公共祖先-88

给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。 最近公共祖先是两个节点的公共的祖先节点且具有最大深度。 样例 对于下面这棵二叉树 4 / \ 3 7 / \ ...
  • ljlstart
  • ljlstart
  • 2015-09-16 23:20:57
  • 899

最近公共祖先(Least Common Ancestors,LCA)问题详解

问题描述 求有根树的任意两个节点的最近公共祖先。 最近公共祖先简称LCA(Lowest Common Ancestor),所谓LCA,是当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的...
  • ywcpig
  • ywcpig
  • 2016-08-28 01:45:53
  • 2852

最近公共祖先

参考文献1 参考文献2 题目:输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点 变种一:二叉树是二分查找树,如果根节点比两个节点都小,则访问右子树,都大则访问左子树,否则即为结果...
  • fangjian1204
  • fangjian1204
  • 2014-08-21 15:02:53
  • 730

最近公共祖先模版

离线算法 #include #include using namespace std; typedef long long LL; const int maxn = 12; int f...
  • u011686226
  • u011686226
  • 2016-07-07 18:35:31
  • 179

简单高效的最近公共祖先问题c++实现

题目连接 http://hihocoder.com/problemset/problem/1062#include "stdafx.h" #include #include #inclu...
  • taoyanqi8932
  • taoyanqi8932
  • 2016-06-07 17:45:55
  • 443

求最近公共祖先和所有祖先

#include "btree.cpp" //二叉链的基本运算 #includeusing namespace std;bool allAncestor(BTNode *b, ElemType t)/...
  • LYJ_viviani
  • LYJ_viviani
  • 2017-03-28 10:19:51
  • 550

最近公共祖先(LCA)详解

LCA问题(Least Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两个顶点u和v的最近公共祖先,即找...
  • u014679804
  • u014679804
  • 2015-08-26 11:09:12
  • 2007

LintCode-最近公共祖先

给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。 最近公共祖先是两个节点的公共的祖先节点且具有最大深度。 您在真实的面试中是否遇到过这个题?  Yes 样例 对于...
  • wangyuquanliuli
  • wangyuquanliuli
  • 2015-06-25 12:16:20
  • 2431
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 1503
    排名: 3万+
    最新评论