【面試題68-Ⅰ 二叉搜索樹的最近公共祖先】
面試題68-Ⅰ:二叉搜索樹的最近公共祖先:給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。百度百科中最近公共祖先的定義爲:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示爲一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。”
思路一:迭代法。題給爲二叉搜索樹,所以很容易判斷各個值的相對位置關係。當 p 和 q 都在 root 的同一側(左子樹 / 右子樹)時,則遍歷到 root.left / root.right,否則,當前 root 就是 p 和 q 的公共祖先。
時間複雜度:,n 爲二叉樹結點數,二叉搜索樹層數爲 logn,最壞情況下,二叉樹退化爲鏈表,最大層數爲 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':
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。
時間複雜度:,n 爲二叉樹結點數,二叉搜索樹層數爲 logn,最壞情況下,二叉樹退化爲鏈表,最大層數爲 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