1. 程式人生 > >LeetCode——二叉樹/二叉搜尋樹的公共祖先

LeetCode——二叉樹/二叉搜尋樹的公共祖先

235.二叉搜尋樹的最近公共祖先
給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。

百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。”

例如,給定如下二叉搜尋樹: root = [6,2,8,0,4,7,9,null,null,3,5]

    _______6______
   /              \
___2__          ___8__

/ \ /
0 _4 7 9
/
3 5
示例 1:

輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
輸出: 6
解釋: 節點 2 和節點 8 的最近公共祖先是 6。
示例 2:

輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
輸出: 2
解釋: 節點 2 和節點 4 的最近公共祖先是 2, 因為根據定義最近公共祖先節點可以為節點本身。
說明:

所有節點的值都是唯一的。
p、q 為不同節點且均存在於給定的二叉搜尋樹中。

思路:二叉搜尋樹稍微簡單些,因為左子樹上的所有節點的值都要小魚它的根節點的值,右子樹上所有節點的值均大於它根節點的值。

所以直接比較即可

class Solution:
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
        if p.val < root.val > q.val:
            return self.lowestCommonAncestor(root.left, p, q)
        if p.val > root.val < q.val:
            return self.lowestCommonAncestor(root.right, p, q)
        return root

236.二叉樹的最近公共祖先
給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

百度百科中最近公共祖先的定義為:“對於有根樹 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。
示例 2:

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。因為根據定義最近公共祖先節點可以為節點本身。
說明:

所有節點的值都是唯一的。
p、q 為不同節點且均存在於給定的二叉樹中。

思路::LCA(最近公共父節點)問題是二叉樹裡很經典的問題了,若是樹的結構中有parent指標的話那這一題就很容易了,若沒有的話就需要想一想了。

依然用到了分治法的思想,想一想,若是對於一個樹結點,在左子樹中找到了A,在右子樹中找到了B,那說明此結點是公共節點

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

class Solution:
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
        
        if(root is None or root==p or root==q):
            return root        #若root為空或者root為A或者root為B,說明找到了A和B其中一個
        left=self.lowestCommonAncestor(root.left,p,q)
        right=self.lowestCommonAncestor(root.right,p,q)
        if(left is not None and right is not None):
            return root      #若左子樹找到了p,右子樹找到了q,說明此時的root就是公共祖先
        if(left is None):    #若左子樹是none右子樹不是,說明右子樹找到了p或q
            return right
        if(right is None):   #同理
            return left
        return None