二叉树的最近公共祖先

题目

    输入一颗以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;//一空一有值说明最近公共祖先为左或右的子结点
}

    这里读者可能会有诱惑,为什么求出的答案会是最近公共祖先。因为这里我们将判断的处理放在了最下面,也就形成了后序遍历,依次从下往上,这样最先找到的答案就是最近值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值