给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root == nil {
return nil
}
// 当前节点等于其中一个目标节点,当前节点就是最近公共祖先
if root == p || root == q {
return root
}
// 递归搜索左右子树
left := lowestCommonAncestor(root.Left, p, q)
right := lowestCommonAncestor(root.Right, p, q)
// 如果左右子树的结果都不为空,说明目标节点分布在当前节点的两侧
// 当前节点就是最近公共祖先
if left != nil && right != nil {
return root
}
// 如果左子树的结果不为空,右子树的结果为空,说明目标节点都在左子树
// 最近公共祖先就是左子树的结果
if left != nil {
return left
}
// 如果右子树的结果不为空,左子树的结果为空,说明目标节点都在右子树
// 最近公共祖先就是右子树的结果
return right
}