#力扣 LeetCode235. 二叉搜索树的最近公共祖先 @FDDLC

题目描述:

235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com)

 

Java代码一:

class Solution { //所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。
    TreeNode answer=null,p,q;
    public boolean ancestor_and_descendent(TreeNode a,TreeNode d){ //判断a、d是否是祖先与后代的关系
        if(a==null||d==null)return false;
        if(a==d)return true;
        return ancestor_and_descendent(a.left,d)||ancestor_and_descendent(a.right,d);
    }
    public void go(TreeNode root){
        if(ancestor_and_descendent(root,p)&&ancestor_and_descendent(root,q)){ //本结点是共祖
            if(ancestor_and_descendent(root.left,p)&&ancestor_and_descendent(root.left,q))go(root.left); //左结点是共祖
            else if(ancestor_and_descendent(root.right,p)&&ancestor_and_descendent(root.right,q))go(root.right); //右结点是共祖
            else answer=root; //左右结点都不是共祖;既然自己是共祖,那肯定就是最近的共祖了!注:左结点是共祖和右结点是共祖互斥!
        }
    }
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        this.p=p;
        this.q=q;
        go(root);
        return answer;
    }
}

 

Java代码二:

class Solution { //所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //二叉搜索树:左小右大
        if(p.val<root.val&&q.val<root.val)return lowestCommonAncestor(root.left,p,q); //都在左
        if(p.val>root.val&&q.val>root.val)return lowestCommonAncestor(root.right,p,q); //都在右
        return root; //p、q分居root两侧;p是q的祖先;q是p的祖先
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值