当前位置: 首页 > news >正文

三种思路彻底掌握 BST 判断(递归与迭代全解析)——力扣98.验证二叉搜索树

力扣98.验证二叉搜索树

在这里插入图片描述


验证二叉搜索树(Validate Binary Search Tree)题解大全

一、题目描述

给定一个二叉树的根节点 root,判断它是否是一棵有效的二叉搜索树(BST)。

有效二叉搜索树的定义:

  1. 节点的左子树只包含严格小于当前节点的值;
  2. 节点的右子树只包含严格大于当前节点的值;
  3. 所有左子树和右子树本身也必须是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5,但其右子树中的节点 4 小于 5。

提示:

  • 节点总数范围:[1, 10⁴]
  • 节点值范围:[-2³¹, 2³¹ - 1]

二、思路分析

判断是否为二叉搜索树,本质上有两种思路:

  1. 区间递归法: 每个节点的值必须在一个动态变化的 (min, max) 范围内;
  2. 中序遍历法: 二叉搜索树的中序遍历序列应严格递增。

这两种思路都能达到 O(n) 的时间复杂度,区别在于递归参数设计与思维方式不同。


三、解法一:递归区间法(Top-Down)

核心思想:
从根节点开始,为每个节点维护一个允许取值的上下界:

  • 对左子树而言,最大值应为当前节点值;
  • 对右子树而言,最小值应为当前节点值。

若某个节点值不在范围内,则立即返回 false

代码实现:

class Solution {public boolean isValidBST(TreeNode root) {return validate(root, Long.MIN_VALUE, Long.MAX_VALUE);}private boolean validate(TreeNode node, long min, long max) {if (node == null) return true;if (node.val <= min || node.val >= max) return false;return validate(node.left, min, node.val) && validate(node.right, node.val, max);}
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度:O(n),每个节点访问一次;
  • 空间复杂度:O(h),h 为树的高度(最坏 O(n))。

思维亮点:

  • 使用 long 避免边界越界;
  • “上下界随递归动态变化”的设计思路极具通用性。

四、解法二:中序遍历法(Inorder Traversal)

核心思想:
二叉搜索树的中序遍历结果是一个严格递增序列

因此,只需在遍历过程中比较当前节点值是否大于前一个节点值即可。

代码实现:

class Solution {private long prev = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if (root == null) return true;if (!isValidBST(root.left)) return false;if (root.val <= prev) return false;prev = root.val;return isValidBST(root.right);}
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(h)

思维亮点:

  • 利用 BST 的中序有序性质;
  • 实现极为简洁,逻辑清晰。

五、解法三:迭代中序法(使用显式栈)

核心思想:
用栈模拟中序遍历过程,每次取出最左节点,与前驱节点比较。

代码实现:

import java.util.Stack;class Solution {public boolean isValidBST(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode curr = root;long prev = Long.MIN_VALUE;while (curr != null || !stack.isEmpty()) {while (curr != null) {stack.push(curr);curr = curr.left;}curr = stack.pop();if (curr.val <= prev) return false;prev = curr.val;curr = curr.right;}return true;}
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

思维亮点:

  • 无递归调用栈;
  • 适合面试场景手写;
  • 清晰体现中序遍历过程。

六、方法对比总结

方法思路核心实现方式是否递归是否利用中序有序性时间复杂度空间复杂度特点
区间递归法动态上下界限制递归O(n)O(h)思维直观、通用性强
中序递归法严格递增序列递归O(n)O(h)简洁优雅、代码最短
迭代中序法栈模拟中序迭代O(n)O(n)面试友好、结构清晰

扩展思考:

  • 若想要“找到二叉搜索树中的第 k 小节点”,可以在中序遍历中计数;
  • 若想“修复错误的二叉搜索树”,也可以利用中序递增特性定位错误节点。

http://www.dtcms.com/a/490149.html

相关文章:

  • 基于k8s环境的mongodb多副本高可用方案
  • 汽车免拆诊断案例 | 2014 款宝马 M4 车冷起动后发动机抖动
  • 横泉水库建设管理局网站鄂州网站建设哪家专业
  • 虚拟人驱动密码:惯性动作捕捉设备+无穿戴动作捕捉技术
  • Linux01
  • StarRocks 数据分析加速:ETL 如何实现实时同步与高效查询
  • 2025年主流开源AI智能体框架平台概览
  • 自己做卖假货网站手机网站
  • 多字节串口收发IP设计(六)串口帧接收模块设计及仿真(含源码)
  • Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
  • 项目实践1—全球证件智能识别系统(Qt客户端开发+FastAPI后端人工智能服务开发)
  • 源同步接口(六)
  • app 门户网站我在征婚网站认识一个做IT
  • 【FFmpeg】对比 d3d12va 、d3d11va、dxva2 这三种视频硬解方案
  • 苹果iOS开发零基础特训(视频教程)
  • 数字图像相关(DIC)技术在岩石剪切变形测量中的应用研究:全场应变与破坏机制分析
  • 建站工具 开源捷克网站后缀
  • @Resource和@Autowired注入区别
  • 网站设置cookie什么意思以个人名义做地方门户网站
  • 客户案例 | 派克新材x甄知科技,构建全场景智能IT运维体系
  • python基本数据类型、字典、 集合、条件与循环控制、函数(3)
  • 语音处理:wav头格式非44字节场景处理分析
  • git 安全证书 【git】
  • leetcode 168. Excel 表列名称 python
  • LabVIEW 高速采集系统性能优化
  • 忻州建设公司网站临汾做网站的公司
  • 书籍学习|基于SprinBoot+vue的书籍学习平台(源码+数据库+文档)
  • PNNX + TorchScript + 手动修改后处理逻辑,最终输出适配 NCNN官方 yolov8.cpp
  • 记录小程序真机bug,而模拟器无法复现
  • 【iOS取证篇】浅谈iPhone手机的失窃设备保护功能