二叉树-二叉搜索树的最近公共祖先

目录

一、问题描述

二、解题思路

三、代码实现

四、刷题链接


一、问题描述

二、解题思路

        这个问题和之前做过的问题很相似:

深度优先遍历-在二叉树中找到两个节点的最近公共祖先-CSDN博客文章浏览阅读80次。java刷题:在二叉树中找到两个结点的最近公共祖先结点。https://blog.csdn.net/hehe_soft_engineer/article/details/139799167?spm=1001.2014.3001.5501        不过在这个问题背景下,结点之间是大小相对有序的,所以:

        1.我们可以直接根据当前结点和目标值p和q之间的大小关系确定当前结点是否是最近的公共祖先结点

        2.由二叉搜索树的性质决定,左侧的所有值都比根结点小,右侧的所有值都比根结点大,所以我们先要对p和q进行大小判断,选择出较小值minnum,选出较大值maxnum

        3.1 当minnum都大于当前结点值时,说明minnum和maxnum一定在当前结点的右子树;

        3.2 当maxnum都小于当前结点值时,说明minnum和maxnum一定在当前结点的左子树;

        3.3 当maxnum大于当前结点值,minnum小于当前结点值时,当前结点一定是最近的祖先结点。

三、代码实现

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    int resnum=0;
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param p int整型 
     * @param q int整型 
     * @return int整型
     */
    public int lowestCommonAncestor (TreeNode root, int p, int q) {
        int maxnum=p>q?p:q;
        int minnum=p<q?p:q;
        
        dfs(root,maxnum,minnum);

        return resnum;

    }

    public void dfs(TreeNode root,int maxnum,int minnum){
        if(maxnum<root.val){
            dfs(root.left,maxnum,minnum);
        }else if(minnum>root.val){
            dfs(root.right,maxnum,minnum);
        }else{
            if(root.val==maxnum){
                resnum=maxnum;
            }else if(root.val==minnum){
                resnum=minnum;
            }else{
                resnum=root.val;
            }
            return;
        }
    }

}

四、刷题链接

二叉搜索树的最近公共祖先_牛客题霸_牛客网

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值