二叉树 — 返回最大的二叉搜索子树大小

news2024/11/15 19:46:27

题目:
给定一棵二叉树的head节点,返回这颗二叉树中最大的二叉搜索子树的大小。
一颗二叉树来讲,可能整棵树不是搜索二叉树,但子树是一颗搜索二叉树。如下图所示,这时要返回这颗子搜索二叉树的最大节点个数。下图中,最大的二叉搜索子树大小为:3(5 -> 1 -> 7)。
在这里插入图片描述
子树的概念是:每个单独节点算一棵子树, 5 -> 1 -> 7三个节点算一棵子树(不可以舍弃任何一个)
1 -> 5 -> 7 -> 6 -> 2同样也算一棵子树,同样不可以舍弃任何一个节点。

分析

  1. 如果左树是二叉搜索树的情况
  2. 右树是二叉搜索树的情况
  3. 整棵树是二叉搜索树的情况
  4. 判断是否是二叉搜索树需要左右子树max、min的值和当前值节点值进行比较,如果左树最大值小于当前值,右树最小值大于当前值,则说明是一颗二叉搜索树
  5. 需要整棵树的节点数变量(allSize)和满足子树最大二叉搜索树节点数变量(maxBSTSubtreeSize),如果两个值相等,说明是二叉搜索树,如果不相等,则说明不是(用这两个值在构建Info信息类时,可省略一个bollean isBST的变量)。

代码:
Info类用于收集树的信息,并通过递归返回给上层,供上层调用进行分析。

public static class Info{
        int max;
        int min;
        int allSize;
        //满足子树是二叉搜索树最大节点个数
        int maxBSTSubtreeSize;

        public Info(int maxBSTSubtreeSize,int allSize,int max,int min){
            this.maxBSTSubtreeSize = maxBSTSubtreeSize;
            this.allSize = allSize;
            this.max = max;
            this.min = min;
        }
    }
public static int largestBSTSubtree(Node head){
        if(head == null){
            return 0;
        }

        return process(head).maxBSTSubtreeSize;
    }

     //       6
    //    2      7
    // 1    5
    public static Info process(Node head){
        if (head == null){
            return null;
        }

        Info leftInfo = process(head.left);
        Info rightInfo = process(head.right);

        int max = head.val;
        int min = head.val;
        int allSize = 1;

        if (leftInfo != null){
            max = Math.max(max,leftInfo.max);
            min = Math.min(min,leftInfo.min);
            allSize += leftInfo.allSize;
        }

        if (rightInfo != null){
            max = Math.max(max,rightInfo.max);
            min = Math.min(min,rightInfo.min);
            allSize += rightInfo.allSize;
        }
        //如果左子树不为null,则修改 p1 为 左子树的最大二叉搜索树的个数
        int p1 = -1;
        if (leftInfo != null){
            p1 = leftInfo.maxBSTSubtreeSize;
        }

        //如果右树不为null, 则修改 p2 为 右子树的最大二叉搜索树的个数
        int p2 = -1;
        if (rightInfo != null){
            p2 = rightInfo.maxBSTSubtreeSize;
        }
        
        //只有在左右子树都满足是二叉搜索树的情况下,才更新p3。
        int p3 = -1;
        //左右子树的最大二叉搜索树的个数 = 左右子树整棵树的个数,则说明为二叉搜索树。
        //如果maxBSTSubtreeSize != allSize 则说明之前遍历左右树过程中,出现了 左树最大值 > 当前节点 或 右树最小值 < 当前节点的情况
        boolean isBSTLeft = leftInfo == null ? true : (leftInfo.maxBSTSubtreeSize == leftInfo.allSize);
        boolean isSBTRight = rightInfo == null ? true : (rightInfo.maxBSTSubtreeSize == rightInfo.allSize);

        if (isBSTLeft && isSBTRight){
            //看左子树的最大值 是否小于当前树的值
            //看右子树的最小值 是否小于当前数的值
            boolean leftMaxLessX = leftInfo == null ? true : (leftInfo.max < head.val);
            boolean rightMinMoreX = rightInfo == null ? true : (rightInfo.min > head.val);

            if (leftMaxLessX &&  rightMinMoreX){
                int leftSize = leftInfo == null ? 0 : leftInfo.allSize;
                int rightSize = rightInfo == null ? 0 : rightInfo.allSize;
                p3 = leftSize + rightSize + 1;
            }
        }
        return new Info(Math.max(p3,Math.max(p1,p2)),allSize,max,min);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/731062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【node报错】cannot be loaded because running scripts is disabled on this system.

了解意思&#xff1a; cannot be loaded because running scripts is disabled on this system. 因为在该系统上禁用了运行脚本&#xff1b; 这个错误是由于你的系统执行策略&#xff08;Execution Policies&#xff09;禁止运行脚本导致的。Windows 系统默认情况下禁止运行…

ChatGPT前身GPT的论文-译文

写在前面 论文 Improving Language Understanding by Generative Pre-Training 地址 https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf ChatGPT火了&#xff0c;改论文作为ChatGPT的前身&#xff0c;可以从这里看到ChatGPT的原始影子。 摘要 自然语言…

制造业怎么应用大数据?_光点科技

随着信息技术的迅猛发展&#xff0c;大数据正逐渐成为各行各业的重要资源和工具。在制造业中&#xff0c;大数据的应用也逐渐得到了广泛关注。 制造业如何应用大数据&#xff1f; 首先&#xff0c;数据采集是制造业应用大数据的重要一环。制造业的生产过程中涉及到大量的数据&a…

二叉树OJ题:LeetCode--101.对称二叉树

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第144道二叉树OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

49天精通Java,第0天,编程语言类型有哪些?我心中的TOP1编程语言,什么是java跨平台性?

目录 一、常见的编程语言类型1、机器语言2、汇编语言3、高级语言 二、计算机编程语言三、跨平台性1、跨平台的优势包括&#xff1a;2、实现跨平台的方式包括&#xff1a; 四、Java的跨平台性五、java运行时和虚拟机六、Java内存管理和Java垃圾回收1、Java内存管理2、Java垃圾回…

基于matlab使用虚幻引擎模拟开发视觉SLAM算法(附源码)

一、前言 本示例展示了如何使用从虚幻引擎模拟环境中获取的图像数据开发可视化同步定位和映射&#xff08;SLAM&#xff09;算法。 视觉SLAM是计算摄像机相对于周围环境的位置和方向&#xff0c;同时映射环境的过程。开发可视化 SLAM 算法并评估其在不同条件下的性能是一项具…

抖音短视频矩阵管理系统源码开发部署(开源定制)

一、什么是短视频矩阵管理系统&#xff1f; 短视频矩阵管理系统是专门为企业号商家、普通号商家提供帐号运营从流量 到转化成交的一站式服务方案&#xff0c;具体包含&#xff1a;点赞关注评论主动私信 &#xff0c;评论区回复&#xff0c;自动潜客户挖掘&#xff0c;矩阵号营销…

今日小课堂:会议录音转文字怎么弄的

小君&#xff1a;嘿&#xff0c;你知道怎么把录音转成文字吗&#xff1f;我今天录了一个重要的会议&#xff0c;但是时间有限&#xff0c;需要快速整理笔记。 小辉&#xff1a;当然&#xff01;你可以使用一些工具来将录音转换为文字。最简单的方法就是利用语音转文字的应用。…

C语言 while 和 do while 区别

先简单介绍一下C语言中的while和do while语句 while循环 语法 C 语言中 while 循环的语法&#xff1a; while(condition) {statement(s); } 在这里&#xff0c;statement(s) 可以是一个单独的语句&#xff0c;也可以是几个语句组成的代码块。 condition 可以是任意的表达…

Kubernetes 启动Pod的方法-Pod的调度算法-Pod间的通信-k8s的控制器-Pod资源控制-发布Service服务

目录 Pod 参考文档&#xff1a;Pod | Kubernetes Pod配置文件&#xff1a;simple-pod.yaml 对master进行如下操作 Pod的状态有&#xff1a; 参考文档&#xff1a;(70条消息) Pod生命周期中的状态解释_pod状态_闹玩儿扣眼珠子的博客-CSDN博客 进入Pod内的nginx容器&#…

【Ubuntu】系统U盘变为普通U盘

如果您在 Ubuntu 系统上没有磁盘工具可用&#xff0c;您可以尝试使用命令行工具来格式化系统 U 盘。请按照以下步骤进行操作&#xff1a; 打开终端&#xff1a;在 Ubuntu 桌面上&#xff0c;按下 Ctrl Alt T 快捷键&#xff0c;或者在应用程序菜单中搜索并打开 "终端&qu…

PPT文件,使用python删除链接

文章目录 一、需求二、处理方式三、代码实现 一、需求 如下图所示&#xff0c;将PPT文件中的链接进行删除&#xff0c;且不保留链接名。 原始文件&#xff1a; 处理后文件&#xff1a; 二、处理方式 使用python 的pptx模块进行处理&#xff0c;读取文字块&#xff0c;然后…

FPGA实验二:模可变计数器设计

目录 一、实验目的 二、实验要求 三、实验代码 1.实验源码 2.部分代码设计思路分析 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 3、下载测试结果及分析 五、实验心得 1.解决实验中遇到的困难及解决 2.完成实验后的心得 一、实验目的 &#xff08;1&#xf…

【Linux系统编程】Linux 软件包管理器——yum

文章目录 1. 什么是yum2. yum的使用2.1 注意事项2.2 查看软件包2.3 如何安装软件2.4 如何卸载软件2.5 yum源 这篇文章我们要学习的是—— Linux 软件包管理器 yum。 1. 什么是yum 首先来问大家一个问题&#xff1a; 我们平时使用的手机上&#xff0c;都会有一个应用叫做“应…

【全栈开发指南】OAuth2授权获取token调试接口的方式

在我们实际应用接口的调用调试过程中&#xff0c;需要用到token或者刷新token&#xff0c;GitEgg支持OAuth2.0协议进行认证授权&#xff0c;这里介绍说明如何通过Postman获取token和refresh_token并进行接口调试。 1、使用密码模式获取token 根据spring-security-oauth2的实现…

创建虚拟机安装windowserver2016服务器(NETBASE第二课)

2 操作流程 文件-新建虚拟机-自定义&#xff08;高级&#xff09;-下一步-稍后安装操作系统-下一步-客户机操作系统-选择Windows 10 X64-下一步-虚拟机名输入win10-1-位置选择&#xff08;E:\虚拟机\Win10-1&#xff09;-下一步-固件类型选择UEFI-下一步-下一步-输入内存2048M-…

2023年Arm最新处理器架构分析——X4、A720和A520

1、引言 上一篇文章我们介绍了Arm的Cortex-X1至Cortex-X3系列处理器&#xff0c;2023年的5月底&#xff0c;Arm如期发布了新一年的处理器架构&#xff0c;分别为超级大核心Cortex-X4&#xff0c;大核心A720和小核心A520。在智能手机行业&#xff0c;Arm始终保持每年一迭代的处…

ModaHub魔搭社区:ChatGLM-RLHF:无需微调 教程

目录 使用方法 效果展示 对ChatGLM直接使用RLHF进行调整参数&#xff0c;无需传统的finetune|Modify ChatGLM params with only RLHF。 大部分的RLHF代码都是在分布式框架&#xff0c;不适合学习和使用&#xff0c;本代码的RLHF代码不需要Megatron或者deepspeed框架&#xff…

Maven高级(三)--聚合

1.解决的问题&#xff1a; 此时tlias-web-management模块的父工程是tlias-parent,该模块又依赖了tlias-pojo,tlias-utils模块。那么此时&#xff0c;我们要将tlias-web-management模块打包&#xff0c;是比较繁琐的。因为进行项目打包&#xff0c;maven会从本地仓库来查找tlias…

Jupyter notebook 安装代码提示和补全

打开Anaconda Prompt 终端 依次输入 pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user pip install jupyter_nbextensions_configurator jupyter nbextensions_configurator enable --user 打开Jupyter notebook