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

14 - Hard - 二叉树的最近公共祖先

作者: 1f872d1e3817 | 来源:发表于2018-06-26 12:50 被阅读0次

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

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

    例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

           _______3______
           /              \
        ___5__          ___1__
       /      \        /      \
       6      _2       0       8
             /  \
             7   4
    

    示例 1:
    输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
    输出: 3
    解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
    </pre>

    示例 2:
    输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
    输出: 5
    解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
    </pre>

    说明:

    • 所有节点的值都是唯一的。
    • p、q 为不同节点且均存在于给定的二叉树中。
    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def lowestCommonAncestor(self, root, p, q):
            """
            :type root: TreeNode
            :type p: TreeNode
            :type q: TreeNode
            :rtype: TreeNode
            """
            self.travel(root, None)
            node = p
            p_list = []
            while node:
                p_list.append(node)
                node = node.parent
            node = q
            while node:
                if node in p_list:
                    return node
                node = node.parent
            return root
                
        def travel(self, node, parent):
            if not node:
                return
            node.parent = parent
            self.travel(node.left, node)
            self.travel(node.right, node)
    

    相关文章

      网友评论

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

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