二叉树套路4

package class08;
/*
* 可能性:head有无关
* 无关:左右树的最大搜素子二叉树大小
* 有关:左右都属搜索二叉树,且左边的最小于head,右边最小大于head
*
* 统一:
* 左边:最大子搜索树size,左边是不是搜索二叉树,max
* 右边:最大子搜索树size,它整体是不是搜搜二叉树,min
* 全集:最大子搜索树size,是不是整体是,max和min
*
* */
public class MaxSubSearchBT {
    public static class Node{
        int value;
        Node left;
        Node right;
        public Node(int value) {
            this.value = value;
        }
    }
    public static class Info{
        int maxSearchSize;
        boolean isAllBST;
        int min;
        int max;
        public Info(int maxSearchSize, boolean isAllBST, int min, int max) {
            this.maxSearchSize = maxSearchSize;
            this.isAllBST = isAllBST;
            this.min = min;
            this.max = max;
        }
    }

    public static Info process(Node head){
        if(head==null){
            //不好确定min和max可以返回空,但是每次用信息时候要判空
            //所以每个信息要有初始值
            return  null;
        }
        Info leftInfo=process(head.left);
        Info rightInfo=process(head.right);

        int min=head.value;
        if(head.left!=null){
            min=leftInfo.min;
        }
        if(head.right!=null){
            min=Math.min(min,rightInfo.min);
        }


        int max=head.value;
        if(head.left!=null){
            max=leftInfo.max;
        }
        if(head.right!=null){
            max=Math.max(max,rightInfo.max);
        }



        int maxSearchSize = 0;
        if(head.left!=null){
            maxSearchSize= leftInfo.maxSearchSize;
        }
        if(head.right!=null){
            maxSearchSize=rightInfo.maxSearchSize;
        }


        //一般最后处理和head有关的答案,因为要用到前面的信息
        boolean isAllBST = false;
        if(
                (head.left==null?true:isAllBST)&&(head.right==null?true:isAllBST)
                 &&(head.value>leftInfo.max)&&(head.value<rightInfo.min)
        ){
            isAllBST=true;
            maxSearchSize=(head.left==null?0:leftInfo.maxSearchSize)
                       +(head.right==null?0:rightInfo.maxSearchSize)+1;
        }




        return new Info(maxSearchSize,isAllBST,min,max);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赑屃爱Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值