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

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

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

思路:二叉樹後序遍歷。遇到 p 或 q 向上返回,判斷出 p 和 q 在某 root 節點的異側時,該 root 即爲最近的公共祖先,直接 return root。

遞歸邊界條件:當越過葉節點時,直接 return。當 root 等於 p 或 root 等於 q 時,return root。

遞歸左子樹,返回值記作 left(其要麼是 null 要麼是 p / q 節點);遞歸右子樹,返回值記作 right(同 left),最後判斷 left 和 right 是否爲空,若 left 和 right 都不爲空,說明 p 和 q 在 root 異側,直接返回 root。若 left 和 right 的其中一個爲空,說明 p 和 q 都在不爲空的那個子樹裏。若 left 和 right 都爲空,說明 p 和 q 查找失敗,返回 null。

時間複雜度O(n)O(n),其中 n 爲二叉樹節點數;最差情況下,需要遞歸遍歷樹的所有節點。
空間複雜度O(n)O(n),最差情況下,遞歸深度達到 n ,系統使用 O(n) 大小的額外空間。

# 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 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 not left: return right
        if not right: return left
        return root

參考:二叉樹的最近公共祖先(後序遍歷 DFS ,清晰圖解)

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