题目
输入一颗以root为根节点的二叉树和该二叉树上的两个结点p和请计算出这两个结点的最近公共祖先
思路分析
直接套用二叉树的遍历框架,这里就不写了。
一道二叉树的此类问题我们要考虑三个问题,分别是:这个函数是个什么的,这个函数参数中的变量是什么, 得到的函数的递归结果我们应该干什么。
//class TreeNode{
// int val;
// TreeNode left;
// TreeNode right;
//}
TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){
//base case
if(root == null)//根节点的时候就是返回null
return null;
if(root == p || root == q)//说明这时p和q同时在左子树或在右子树
return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if(left != null && right != null)//都不为null说明当前的root就是该树的最近公共祖先
return root;
if(left == null && right == null)//都为null说明p和q不在以root为根节点的树中
return null;
return left == null ? right : left;//一空一有值说明最近公共祖先为左或右的子结点
}
这里读者可能会有诱惑,为什么求出的答案会是最近公共祖先。因为这里我们将判断的处理放在了最下面,也就形成了后序遍历,依次从下往上,这样最先找到的答案就是最近值。