美文网首页
二叉树的最近公共祖先

二叉树的最近公共祖先

作者: hustyanye | 来源:发表于2019-07-21 17:37 被阅读0次

    https://leetcode-cn.com/explore/interview/card/bytedance/244/linked-list-and-tree/1026/

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

    image.png

    这个题一般的思路,先找到p和q的路径,然后去他们的最大前缀的点
    但是有个更好的递归的思路,不过非常难理解。
    首先 如果 p和q是在root的两边找到的,那么他们的最近的公共祖先应该是root
    如果root的left找到的p和q,那说明root的right肯定为None了,那么他们的公共祖先应该是root.left。反之是root.right。
    有了这个逻辑,再加上写好递归的返回条件即可。
    递归的代码如下:

    
    class Solution(object):
        def lowestCommonAncestor(self, root, p, q):
            """
            :type root: TreeNode
            :type p: TreeNode
            :type q: TreeNode
            :rtype: TreeNode
            """
            if not root or root == p or root ==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
    

    相关文章

      网友评论

          本文标题:二叉树的最近公共祖先

          本文链接:https://www.haomeiwen.com/subject/oylvlctx.html