该题解采用递归的方式来查找两个节点 p 和 q 的最近公共祖先。递归函数对当前节点 root 进行如下处理:
1. 如果 root 为空,或者 root 等于 p 或 q,则直接返回 root。
2. 递归查找 root 的左子树和右子树,分别得到左子树和右子树中 p 和 q 的最近公共祖先 left 和 right。
3. 如果 left 和 right 都为空,说明在当前子树中没有找到 p 和 q,返回 None。
4. 如果 left 为空,right 不为空,则说明 p 和 q 都在右子树中,返回 right。
5. 如果 right 为空,left 不为空,则说明 p 和 q 都在左子树中,返回 left。
6. 如果 left 和 right 都不为空,说明 p 和 q 分别在左右子树中,则当前节点 root 就是最近公共祖先,返回 root。
时间复杂度: 平均 O(logn),最坏 O(n)
空间复杂度: 平均 O(logn),最坏 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':
# 如果当前节点为空或等于 p 或 q,直接返回当前节点
if root is None or p == root or q == root:
return root
# 递归查找左子树
left = self.lowestCommonAncestor(root.left, p, q)
# 递归查找右子树
right = self.lowestCommonAncestor(root.right, p, q)
# 如果左右子树都没找到,返回 None
if left is None and right is None:
return
# 如果右子树没找到,返回左子树的结果
if left is None:
return right
# 如果左子树没找到,返回右子树的结果
if right is None:
return left
# 如果左右子树都找到了,说明当前节点就是最近公共祖先,返回当前节点
return root