题目:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
可以使用递归的方式来解决这个问题。递归函数的基本思路是:
- 如果当前节点为空,返回null
- 如果当前节点就是其中一个目标节点,返回当前节点
- 分别在左子树和右子树中查找目标节点
- 如果左右子树都找到了目标节点,说明当前节点就是最近公共祖先,返回当前节点
- 如果只在左子树找到了一个目标节点,返回左子树的结果
- 如果只在右子树找到了一个目标节点,返回右子树的结果
这个leetcode官方题解下面的树很正确的具象化了这个题的任务。
下面附上代码:
public class no_236 {
public static void main(String[] args) {
Integer[] input = {3, 5, 1, 6, 2, 0, 8, null, null, 7, 4};
TreeNode root = TreeNode.buildTree(input);
int p = 5, q = 1;
TreeNode treeNode = lowestCommonAncestor(root, root.left, root.right);
System.out.println(treeNode.val);
}
public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q) return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left != null && right != null) {
return root;
}
if (left != null) {
return left;
}
if (right != null) {
return right;
}
return null;
}
}