返回二叉树的最大的二叉搜索子树的头节点的问题

devtools/2024/9/24 21:50:24/
 

public class test21 {
    // 定义一个内部类Node,表示二叉树的节点
    public static class Node {
        public int value; // 节点的值
        public Node left; // 左子节点
        public Node right; // 右子节点

        // 构造函数,初始化节点的值
        public Node(int data) {
            this.value = data;
        }
    }

//1.与x无关,找左树最大二叉搜索子树大小和右树最大二叉搜索子树大小
//2.与x有关,左树得整体是搜索二叉树,右树得整体是搜索二叉树,左树的max要小于x的值,右树的min要大于x的值

    // 定义一个内部类Info,用于存储关于二叉树的信息
    public static class Info {
        public boolean isAllBST; // 是否为搜索二叉树
        public int maxSubBSTSIZE; // 最大子树的大小
        public int min; // 整棵树的最小值
        public int max; // 整棵树的最大值

        // 构造函数,初始化Info对象的属性
        public Info(boolean is, int size, int mi, int ma) {
            isAllBST = is;
            maxSubBSTSIZE = size;
            min = mi;
            max = ma;
        }
    }

    // process方法,返回给定节点X的二叉树信息
    public static Info process(Node X){
        if(X == null){
            return null; // 如果节点为空,返回null
        }
        // 递归处理左子树和右子树
        Info leftInfo = process(X.left);
        Info rightInfo = process(X.right);

        // 初始化当前节点的最小值和最大值为节点的值
        int min = X.value;
        int max = X.value;

        // 如果左子树信息不为空,更新最小值和最大值
        if(leftInfo != null){
            min = Math.min(min , leftInfo.min);
            max = Math.max(max , leftInfo.max);
        }

        // 如果右子树信息不为空,更新最小值和最大值
        if(rightInfo != null){
            min = Math.min(min , rightInfo.min);
            max = Math.max(max , rightInfo.max);
        }
        // 初始化最大子树大小为0
        int maxSubBSTSIZE = 0;
        // 如果左子树信息不为空,更新最大子树大小
        if(leftInfo != null){
            maxSubBSTSIZE = leftInfo.maxSubBSTSIZE;
        }
        // 如果右子树信息不为空,更新最大子树大小
        if(rightInfo != null){
            maxSubBSTSIZE = Math.max(maxSubBSTSIZE , rightInfo.maxSubBSTSIZE);
        }
        // 初始化isAllBST为false
        boolean isAllBST = false;
        // 判断当前节点是否满足搜索二叉树的条件
        if(     //左侧整体需要是搜索二叉树的条件
                //右侧整体需要是搜索二叉树的条件
                //左侧最大值<X
                //右侧最小值>X
                        (leftInfo == null ? true : leftInfo.isAllBST)
                        && (rightInfo == null ? true : rightInfo.isAllBST)
                        &&(leftInfo ==null ? true : leftInfo.max < X.value)
                        &&(rightInfo ==null ?true : rightInfo.min >X.value)       
        ){
            // 如果满足条件,更新最大子树大小和isAllBST标志
            maxSubBSTSIZE = 
                    (leftInfo ==null ? 0 : leftInfo.maxSubBSTSIZE)
                    +
                    (rightInfo ==null ? 0 : rightInfo.maxSubBSTSIZE)
                    + 
                    1;
            
            isAllBST = true;
        }
        // 返回当前节点的二叉树信息
        return new Info(isAllBST , maxSubBSTSIZE  , min , max);
    }
}
 


http://www.ppmy.cn/devtools/86247.html

相关文章

Python学习计划——9.2多进程编程

多进程编程是一种并发编程的方式&#xff0c;通过使用多个进程来提高程序的并发性能。与多线程相比&#xff0c;多进程编程在处理CPU密集型任务时更有效&#xff0c;因为每个进程都有独立的内存空间和全局解释器锁&#xff08;GIL&#xff09;。 1. 什么是多进程 多进程是一种…

flume知识点

1. 简述什么是Flume &#xff1f; flume 作为 cloudera 开发的实时日志收集系统&#xff0c;受到了业界的认可与广泛应用。Flume 初始的发行版本目前被统称为 Flume OG&#xff08;original generation&#xff09;&#xff0c;属于 cloudera。 但随着 FLume 功能的扩展&#…

程序员纯粹八股文的危害有哪些,应该如何来解决?

“八股文”这个词在程序员面试的上下文中通常指的是那些被广泛讨论、反复练习的问题和答案&#xff0c;它们往往围绕着一些经典的技术知识点&#xff0c;例如算法、数据结构、设计模式等。这些知识在面试中被频繁提及&#xff0c;以至于应聘者经常会提前准备并背诵这些答案&…

html+css 实现4角移动悬停按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

【C++】set的使用

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 &#x1f308;前言&#x1f308;关于set&#x1f525;容量函数emptysize &#x1f525;Modifiersinserteraseclear &#x1f525;Operationsfindcountlower_bound和upper_…

搜维尔科技:Haption Virtuose 6D遥操作控制人形机器人操作

Haption Virtuose 6D遥操作控制人形机器人操作 搜维尔科技&#xff1a;Haption Virtuose 6D遥操作控制人形机器人操作

2024.7.30问题合集

2024.7.30问题合集 1.adb调试出现5037端口被占用的情况2.更改ip地址时出现以下问题3.RV1126 ip配置问题 1.adb调试出现5037端口被占用的情况 问题&#xff1a;5037端口被占用的情况 解决方案&#xff1a;将adb文件下的adb.exe和AdbWinApi.dll两个文件复制到C:\Windows\SysWOW6…

MySQL --- 数据类型

一、类型分类 数值类型bit(M)位类型&#xff0c;M指定位数&#xff0c;默认值1&#xff0c;范围1 - 64bool使用0和1表示真假tinyint [unsigned]带符号范围 -128~127&#xff0c;无符号范围 0~255&#xff0c;默认有符号smallint [unsigned]带符号范围 -2^15~2^15-1&#xff0c…