Leetcode刷題:劍指offer【面試題68-Ⅰ 二叉搜索樹的最近公共祖先】

【面試題68-Ⅰ 二叉搜索樹的最近公共祖先】

面試題68-Ⅰ:二叉搜索樹的最近公共祖先:給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。百度百科中最近公共祖先的定義爲:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示爲一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。”

思路一:迭代法。題給爲二叉搜索樹,所以很容易判斷各個值的相對位置關係。當 p 和 q 都在 root 的同一側(左子樹 / 右子樹)時,則遍歷到 root.left / root.right,否則,當前 root 就是 p 和 q 的公共祖先。

時間複雜度O(n)O(n),n 爲二叉樹結點數,二叉搜索樹層數爲 logn,最壞情況下,二叉樹退化爲鏈表,最大層數爲 n
空間複雜度O(1)O(1)

# 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':
        while root:
            if p.val < root.val and q.val < root.val:
                root = root.left
            elif p.val > root.val and q.val > root.val:
                root = root.right
            else:
                break
        return root

思路二:遞歸。當 p 和 q 都在 root 的左子樹時,則開始遞歸 root.left;當 p 和 q 都在 root 的右子樹時,則開始遞歸 root.right;否則返回 root。

時間複雜度O(n)O(n),n 爲二叉樹結點數,二叉搜索樹層數爲 logn,最壞情況下,二叉樹退化爲鏈表,最大層數爲 n
空間複雜度O(n)O(n),最差情況下,即樹退化爲鏈表時,遞歸深度達到樹的層數 n

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

參考:二叉搜索樹的最近公共祖先(迭代 / 遞歸,清晰圖解)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章