天天看點

LeetCode 14 二叉搜尋樹的最近公共祖先問題描述問題分析代碼

二叉搜尋樹的最近公共祖先 - LeetCode

  • 問題描述
  • 問題分析
  • 代碼

問題描述

  • 給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。
  • 百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x

    的深度盡可能大(一個節點也可以是它自己的祖先)。”

例如,給定如下二叉搜尋樹: root = [6,2,8,0,4,7,9,null,null,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 為不同節點且均存在于給定的二叉搜尋樹中。

問題分析

  利用二叉搜尋樹的性質,即左子樹上的節點都比根節點小,右子樹上的節點都比根節點大。即若是p,q都比根節點大,則最近公共祖先在右子樹上,若是都比根節點小,則都在左子樹上,若一大一小,則根節點就是最近公共節點

代碼

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root in (p,q):
            return root
        if p.val<root.val and q.val<root.val:
            return self.lowestCommonAncestor(root.left,p,q)
        
        if p.val>root.val and q.val>root.val:
            
            return self.lowestCommonAncestor(root.right,p,q)
        
        return root