题目:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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;}
}