题目描述:
解题思路:
这道题和上道题不一样,上一道是二叉搜索树,所以树的元素是有规律的,而这道题是二叉树,树里面的元素是没有规律的。所以要解决这道题不能根据规律去解答,我们可以通过递归的方法去解决它。首先从上向下遍历二叉树,比较每个结点的值是否是p,q的值,然后把这个值返回到上一层。当某个结点的左右子树中分别存在p,q结点,且不在同一侧,则说明这个结点是最近公共祖先。如果p或者q结点为空,则证明p和q都在同一列,因为p,q其中有一个在最上面,所以返回后下面的就没有遍历到了。所以不为空的结点就是它们之间的最近公共祖先结点。
代码实现:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) return null;
if(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;
return left != null ? left : right;
}
}
执行结果: