问题描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
题目描述
解题思路:
注意此题的前置条件是一定有公共祖先,所以可以先判断当前节点是不是祖先,如果是,则继续往下找左右子树,如果左右子树中,有一边找到的公共祖先不存在,直接返回另一边子树中的查找结果,否则返回当前根节点
代码实现
java
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
// 1. 先看根节点是不是祖先
if (root == null || root == p || root == q) {
return root;
}
// 2. 如果根节点是祖先,有没有更近的祖先呢
// 看看左子树
TreeNode left = lowestCommonAncestor(root.left, p, q);
// 看看右子树
TreeNode right = lowestCommonAncestor(root.right, p, q);
// 3. 如果有的话显然只会在一侧 判断一下
if (left == null) {
return right;
}
if (right == null) {
return left;
}
// 4. 如果没有更近的,默认还是返回root
return root;
}