给定一个二叉树, 找到该树中两个指定节点的最近公共祖先

//包含自身也算祖先
//有三种情况:  1.一个结点在左子树,另一个结点在右子树(公共祖先是root)
            //2.两个结点都在左子树或者都在右子树
            //3.其中有个结点是root(公共祖先则是root)
 //因为题中已经说明有树,所以不考虑root为null情况 

 public TreeNode lowestcommomAncestor(TreeNode root, TreeNode p, TreeNode q){
    if(root == p || root == q){  //其中有个结点是root,则公共祖先是root
        return root;
    }
    boolean pInLeft = search(root.left, p);//判断p和传进去的某个结点的引用是否相等,不是和具体的值相等
    boolean qInLeft = search(root.left, q);
    if(pInLeft && qInLeft){    //两个结点都在左子树
        return lowestcommomAncestor(root.left,p,q);
    }
    if(!pInLeft && !qInLeft){  //两个结点都在右子树
        return lowestcommomAncestor(root.right,p,q);
    }
    return root;  //一个结点在左子树,一个结点在右子树,公共祖先是root
}
public boolean search(TreeNode root, TreeNode n){  //等于就是n和root是同一个结点
    if(root == null){
        return false;
    }
    if(root == n){
        return true;
    }
    if(search(root.left, n)){
        return true;
    }
    return search(root.right, n);
}          

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值