Leetcode JAVA刷刷站(98)验证二叉搜索树

news2024/11/13 9:35:36

一、题目概述

二、思路方向  

       在Java中,要判断一个二叉树是否是有效的二叉搜索树(BST),我们可以采用递归的方法,通过维护一个外部的范围(通常是Integer.MIN_VALUEInteger.MAX_VALUE作为初始范围),来确保每个节点的值都在其左子树所有节点值的右侧,并且在其右子树所有节点值的左侧。

三、代码实现  

class TreeNode {  
    int val;  
    TreeNode left;  
    TreeNode right;  
    TreeNode(int x) { val = x; }  
}  
  
public class Solution {  
    public boolean isValidBST(TreeNode root) {  
        return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);  
    }  
  
    private boolean isValidBST(TreeNode node, long minVal, long maxVal) {  
        if (node == null) {  
            return true;  
        }  
  
        // 检查当前节点的值是否在允许的范围内  
        if (node.val <= minVal || node.val >= maxVal) {  
            return false;  
        }  
  
        // 递归检查左子树和右子树  
        return isValidBST(node.left, minVal, node.val) && isValidBST(node.right, node.val, maxVal);  
    }  
}

解释

  1. 递归函数定义isValidBST(TreeNode node, long minVal, long maxVal)是一个递归函数,它接收一个节点以及一个范围(由minValmaxVal表示)。这个范围用于检查当前节点的值是否合法(即大于minVal且小于maxVal)。

  2. 边界条件

    • 如果当前节点为空,则认为是有效的BST(因为空树是BST的一个特例)。
  3. 节点值检查

    • 检查当前节点的值是否小于maxVal且大于minVal。如果不是,返回false
  4. 递归调用

    • 递归地检查左子树,此时范围更新为(minVal, node.val)(即左子树中所有节点的值必须小于当前节点的值)。
    • 递归地检查右子树,此时范围更新为(node.val, maxVal)(即右子树中所有节点的值必须大于当前节点的值)。
  5. 返回值

    • 如果左子树和右子树都是有效的BST,则返回true;否则返回false

执行结果: 

四、小结

       注意,这里将 minValmaxVal的类型设为 long,是为了避免在比较时可能出现的整数溢出问题。特别是当树中节点的值接近 Integer.MAX_VALUE时,与其进行比较的下一个更大的整数将会溢出。通过使用 long类型,我们可以避免这个问题。

 结语 

我宁愿坚强得让人妒忌

也不会懦弱得让人可怜

!!!

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

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

相关文章

网络优化4|网络流问题|路径规划问题|车辆路径问题

网络流问题 网络最大流问题 研究网络通过的流量也是生产管理中经常遇到的问题 例如&#xff1a;交通干线车辆最大通行能力、生产流水线产品最大加工能力、供水网络中最大水流量等。这类网络的弧有确定的容量&#xff0c;虽然常用 c i j c_{ij} cij​表示从节点 i i i到节点 j…

怎么检测电脑的RAM?丨什么是RAM?

RAM 是 Random Access Memory 的缩写&#xff0c;它是一个允许计算机短期存储数据以更快访问的组件。众所周知&#xff0c;操作系统、应用程序和各种个人文件都存储在硬盘驱动器中。 当 CPU 需要调用硬盘上的数据进行计算和运行时&#xff0c;CPU 会将数据传输到 RAM 中进行计…

安防视频汇聚平台EasyCVR启动后无法访问登录页面是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等…

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南&#xff1f;Jenkins怎么配置服务器&#xff1f; Jenkins作为一个流行的自动化服务器&#xff0c;其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能&#xff0c;以实现自动化通知。 Jenkins发邮件&#xf…

NVI技术创新联盟成立,BOSMA博冠IP轻量化制播已运用

2024年北京国际广播电影电视展览会&#xff08;BIRTV&#xff09;首日&#xff0c;由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV 2024超高清全产业链发展研讨会上宣布正式成立。作为国产8K摄像机先行者&#xff0c;BOSMA博冠受邀加入NVI技术…

Flowable BPMN bpmnjs 设计器

最近半年我一直在打造一款行业顶尖的流程设计器&#xff0c;适配了flowable所有的组件&#xff0c;美观&#xff0c;大方&#xff0c;灵活&#xff0c;好用。所有的组件都进行严格的测试并在生产环境上线了。 1、在线预览 2、整体框架布局 3、组件分组 4、完整模式切换 给大…

若依,前后端分离项目,部署到服务器

1.后端项目用maven打包 正式服的话&#xff0c;测试不用加。 application.yml加上context-path: /prod-api 一定要选择root的ruoyi&#xff0c;他会把你自动打包其他模块的依赖 全部成功。然后去ruoyi-admin拿到这个包&#xff0c;java -jar ruoyi-admin.jar就可以了 将jar上…

STM32嵌套向量中断控制器—NVIC

NVIC简介&#xff1a; NVIC&#xff0c;即Nested Vectored Interrupt Controller&#xff08;嵌套向量中断控制器&#xff09;&#xff0c;是STM32中的中断控制器。它负责管理和协调处理器的中断请求&#xff0c;是STM32中处理异步事件的重要机制。 NVIC提供了灵活、高效、可扩…

IoTDB 在顶级会议 VLDB 2024:四篇最新论文入选,特邀做 TPC 报告与讨论会!

再获权威顶会认可 8 月 26 日至 8 月 30 日&#xff0c;数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 三篇论文的最新研发成果被本次大会录用&#xff0c;这其中也包括 TsFile 成为 Apache Top-Level 项目后发表的第一篇顶会论文。 同时&#xff0c;在国际权威数据库…

博弈论详解 2(SG函数 和 SG定理)

传送门&#xff1a;博弈论详解 1&#xff08;基本理论定义 和 Nim 游戏&#xff09; 什么是 SG 函数 接着上次的讲解&#xff0c;我们来了解一个更通用的模型。我们把每一个状态变成一个点&#xff08;在 Nim 游戏里就代表 a a a 数组&#xff09;&#xff0c;如果可以从一种…

008、架构_分布式事务

分布式事务控制 对于一个分布式写事务,计算节点会向GTM申请全局事务GTID,GTID申请成功后,称当前GTID对应的事务是活跃事务,处于未提交状态。如果涉及数据更新,则将GTID信息同步更新到该事务要更新的事务中。成功提交事务后,这里的成功是指分布式事务涉及所有数据节点均提…

C++入门基础知识37——【关于C++ 运算符——关系运算符】

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

Day24 第11站 出发 c++!

1> 思维导图 2> 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 string s1;cout << "请输入一个字符串" << endl;getline(cin,s1);int len s1.length();char buf[128]"";strcpy(buf,s1…

如何使用Smart-Doc高效生成Java WebSocket接口文档

前言 Smart-Doc 是一款强大的文档生成工具&#xff0c;可以帮助开发者轻松地为Java 项目生成清晰、详细的 API 文档。随着WebSocket技术的普及&#xff0c;Smart-Doc 在3.0.7版本开始也增加了对 WebSocket 接口的支持。本文将详细介绍如何使用 Smart-Doc 生成 Java WebSocket …

DIY 300以上fps游戏 台式机 2024年8月(cpu)

组装台式机 CPU处理器 前言&#xff1a;因特尔霸榜&#xff0c;目前cpu全部都是国外产&#xff0c;锐龙是国外在中国的代理。 2024双十一cpu销量 首推cpu&#xff1a;性价比第三名 Intel 酷睿i5 12600KF 1149元 &#xff08;瓦死斗帧率在200-400之间&#xff0c;300上下浮动…

浅谈SpringMvc的核心流程与组件

一、SpringMvc的核心流程 当发起请求时被前置的控制器(DispatcherServlet)拦截到请求&#xff0c;根据请求参数生成代理请求&#xff0c;找到请求对应的实际控制器&#xff0c;控制器处理请求&#xff0c;创建数据模型&#xff0c;访问数据库&#xff0c;将模型响应给中心控制…

vue3子组件修改父组件传来的值

概述 vue3子组件修改父组件的值 不需要父组件传给子组件函数的形式&#xff0c;而是直接在子组件中通过emit修改父组件传来的值 效果图 修改前 修改后 示例代码 父组件Parent.vue <template><Childv-model:txt"state.txt"/> </template> <…

桥接模式-多类型登录方式的思考

桥接模式-SSO单点登录 背景:(业务细节已脱敏)需求:问题:解决方式: OAuth2.0 实现单点登录四种授权模式桥接模式优化问题代码实现 背景:(业务细节已脱敏) 基于实习期间的一个代码重构的思考——业务细节已脱敏 基于内部旧框架实现业务toB管理系统&#xff0c;需要迁移数据并新的…

ABB巨资收购一家电气龙头,为当年卖给日立电气业务回血

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 战略扩张&#xff1a;ABB携SEAM集团深耕电气服务市场 在电气服务领域&#xff0c;ABB再次展现了其强大的市场扩张能力。近日&#xff0c;ABB宣布…