//搜索二叉树

//搜索二叉树
package SearchTree;

/**
 * @author 真他喵的学不动咯
 * @create 2022-08-16--20:38
 */
public class Ser {   //搜索二叉树
    //leetcode  98题

    public static class TreeNode{
        public int val;
        public TreeNode left;
        public TreeNode right;
        TreeNode(int val){
            this.val=val;
        }
    }

    //封装三个信息
    public static class Info{
        public boolean isBST;
        public int max;
        public int min;
        public Info (boolean is,int ma,int mi){
            isBST=is;
            max=ma;
            min=mi;
        }
    }

    public static Info process(TreeNode x) {
        if (x==null){  //要考虑如果头结点是负数,那他自己也是搜索二叉树
            //所以不能设计为空
            return null;
        } //不知如何设置就返回了null,还是自己判断是不是null
            Info leftInfo=process(x.left);
            Info rightInfo=process(x.right);

            int max=x.val;  //先把最大值设置为x的值,再进行替换
            int min=x.val;
            if (leftInfo!=null){
                max=Math.max(leftInfo.max,max);  //左树不空,从左树中找到最大值
                min=Math.min(leftInfo.min,min);
            }
            if (rightInfo!=null){
                max=Math.max(rightInfo.max,max); 右树不空,从右树中找到最大值
                min=Math.min(rightInfo.min,min);
            }
            boolean isBST=true;  //预设为是搜索二叉树
            if (leftInfo!=null&&!leftInfo.isBST){
                //如果左树不空而且左树不是搜索二叉树
                isBST=false;//那整颗数都不是搜索二叉树
            }
            if (rightInfo!=null&&!rightInfo.isBST){
            //如果左树不空而且左树不是搜索二叉树
                 isBST=false;//那整颗数都不是搜索二叉树
             }
             //left Max<x   right min>x
            //如果左树为空,默认左树的最大值小于x直接返回true,否则真的判断两者之间的关系
            boolean leftMaxLessX=leftInfo==null? true:(leftInfo.max<x.val);
            //右树同理
            boolean rightMinMoreX=rightInfo==null? true:(rightInfo.min<x.val);
            if (!leftMaxLessX||!rightMinMoreX){   //有一个不满足,就不是搜索树
                isBST=false;
            }
            return new Info(isBST,max,min);   //返回这棵树的三个信息

        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值