
递归法
二叉搜索树祖先的定义:
若节点p在节点root的左或者右子树中,或者p=root,则称root是p的祖先。
根据祖先的定义,可以分析出以下几种情况:
q和p在root左右两边,此时它们的祖先就是root- 当
root.val < p.val, 则p在root的右子树中 - 当
root.val > p.val,则p在root的左子树中

代码
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
复杂度分析
- 时间复杂度: O(N)
- 空间复杂度: O(N)
迭代法
迭代法的思路与递归法相同
- 遍历查找节点
- 通过判断大小确定
p,q在root的左侧还是右侧,在左子树就遍历root.left, 在右侧就遍历root.right - 如果在两侧,
root就是公共祖先节点
- 通过判断大小确定
- 返回公共节点
root
代码
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
while root:
if root.val < p.val and root.val < q.val:
root = root.right
elif root.val > p.val and root.val > q.val:
root = root.left
else: break
return root
复杂度分析
- 时间复杂度: O(N)
- 空间复杂度: O(N)