【面試題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。
時間複雜度:,其中 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