news 2026/6/25 13:58:55

【基础算法精讲 11】验证二叉搜索树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【基础算法精讲 11】验证二叉搜索树

98. 验证二叉搜索树

给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。

有效二叉搜索树定义如下:

方法一:前序遍历 1、需要判断当前节点所在的区间,是否当前节点大于其左子树所在区间的右端点,是否小于其右子树所在区间的左端点。 2、根节点处于(负无穷,正无穷)区间中,其左子树处于(负无穷,根节点值)区间中,其右子树处于(根节点值,正无穷)区间中。 3、每访问一个节点,则需要更新其左子树和右子树所在的区间值。

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{publicbooleanisValidBST(TreeNoderoot){returncheck(root,Long.MIN_VALUE,Long.MAX_VALUE);}publicbooleancheck(TreeNodenode,longleft,longright){//前序遍历if(node==null){returntrue;}return(left<node.val&&node.val<right)&&check(node.left,left,node.val)&&check(node.right,node.val,right);}}
方法2:中序遍历 中序遍历时,可以把二叉搜索树看成一个有序数组。比较相邻元素的大小即可。
classSolution{longpre=Long.MIN_VALUE;publicbooleanisValidBST(TreeNoderoot){//中序遍历if(root==null){returntrue;}//遍历左子树if(!isValidBST(root.left)){returnfalse;}intcur=root.val;//当前节点与前一个节点的值比较if(cur<=pre){returnfalse;}//更新需要比较的值pre=cur;returnisValidBST(root.right);}}
方法3:后序遍历 1、拿到当前节点左子树的最小值和最大值,以及当前节点的右子树的最小值和最大值 2、满足二叉搜索树:当前节点的值大于左子树的最大值,以及小于右子树的最小值 3、不满足时:返回负无穷和正无穷。这样非二叉搜索树永远返回负无穷和正无穷。 4、如果是空节点,则返回正无穷和负无穷。这样无论如何,都能满足条件,不会因为空节点而判断是非二叉搜索树。
classSolution{publicbooleanisValidBST(TreeNoderoot){//后序遍历// return check(root)[1] != Long.MAX_VALUE;returncheck(root)[0]!=Long.MIN_VALUE;}publiclong[]check(TreeNodenode){//后序遍历if(node==null){returnnewlong[]{Long.MAX_VALUE,Long.MIN_VALUE};}long[]leftTree=check(node.left);long[]rightTree=check(node.right);intx=node.val;if(x<=leftTree[1]||x>=rightTree[0]){//如果是比较左子树的话,当前节点永远小于leftTree[1]//如果是比较右子树的话,当前节点永远大于rightTree[0]//这样就能识别这是一个非二叉搜索树returnnewlong[]{Long.MIN_VALUE,Long.MAX_VALUE};}returnnewlong[]{Math.min(leftTree[0],x),Math.max(rightTree[1],x)};}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 13:51:53

为什么 React 和 Vue 不一样?

为什么两种架构走向了不同的道路 1.1 UI 的本质是什么 要理解 React Fiber 和 Vue 响应式系统为何走向截然不同的架构路径&#xff0c;我们必须回到一个更根本的问题&#xff1a;用户界面的本质是什么。React 团队给出的答案是——UI 是状态的函数&#xff08;UI f(state)&am…

作者头像 李华
网站建设 2026/6/25 13:49:38

【ESP32S3 + ATGM332D GPS模块实战:从NMEA解析到本地速度计算】

【ESP32S3 ATGM332D GPS模块实战&#xff1a;从NMEA解析到本地速度计算】项目概述一、硬件准备1.1 核心部件1.2 硬件连接二、软件配置2.1 PlatformIO环境配置2.2 核心库介绍三、代码实现3.1 完整代码3.2 关键技术解析3.2.1 NMEA数据解析3.2.2 本地墨卡托投影&#xff08;ENU坐…

作者头像 李华
网站建设 2026/6/25 13:49:14

如何解决小说创作中的组织混乱问题:使用Bibisco的完整解决方案

如何解决小说创作中的组织混乱问题&#xff1a;使用Bibisco的完整解决方案 【免费下载链接】bibisco Novel writing software 项目地址: https://gitcode.com/gh_mirrors/bi/bibisco 在小说创作过程中&#xff0c;作者常常面临角色管理混乱、情节结构松散、数据丢失风险…

作者头像 李华
网站建设 2026/6/25 13:47:16

Mac上使用VScode优雅开发STM32

这里插播一个小Tips适用于平时使用VSCode开发不同方向的朋友&#xff1a;我们可以使用VSCode的Profile功能实现不同开发的隔离&#xff0c;比如你要是个全才&#xff0c;你又会搞嵌入式&#xff0c;又搞AI&#xff0c;又搞JAVA等&#xff0c;那你就可以为自己不同的开发方向设置…

作者头像 李华