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

LeetCode-hot100——验证二叉搜索树

题目:验证二叉搜索树

问题定义

验证二叉搜索树(BST)是判断一棵棵二叉树是否满足以下特性:

  • 左子树中所有节点的值都严格小于当前节点的值
  • 右子树中所有节点的值都严格大于当前节点的值
  • 左、右子树也必须是有效的二叉搜索树

方法思路

采用「递归 + 范围约束」策略,核心思想是为每个节点维护一个合法的取值范围(最小值min和最大值max):

  1. 根节点的初始范围为(-∞, +∞)(用 LONG_MIN 和 LONG_MAX 表示)
  2. 左子树的取值范围为(父节点的min, 父节点的值)
  3. 右子树的取值范围为(父节点的值, 父节点的max)
  4. 若任何节点的值超出其合法范围,则该树不是有效的 BST

代码实现

class Solution {
public:// 辅助递归函数:验证以root为根的子树是否为BST// min: 当前子树节点允许的最小值(开区间)// max: 当前子树节点允许的最大值(开区间)bool BST(TreeNode* root, long long min, long long max) {// 空节点视为有效BSTif (root == nullptr) return true;// 若当前节点值超出范围,则不是BSTif (root->val >= max || root->val <= min) return false;// 递归验证左子树和右子树// 左子树最大值为当前节点值,右子树最小值为当前节点值return BST(root->left, min, root->val) && BST(root->right, root->val, max);} // 主函数:验证整棵树是否为BSTbool isValidBST(TreeNode* root) {// 初始范围设为long long的极值,避免int边界值问题return BST(root, LONG_MIN, LONG_MAX);}
};

样例演示

以示例[6,3,8,2,5,7,9]为例;

          6/   \3     8/ \   / \2   5 7   9

根节点验证

调用  BST(6, LONG_MIN, LONG_MAX)
  • 节点值:6
  • 合法范围:(-∞, +∞)
  • 验证:6 在范围内
  • 下一步:验证左子树 (3) 和右子树 (8)

左子树验证(节点 3)

调用  BST(3, LONG_MIN, 6)
  • 节点值:3
  • 合法范围:(-∞, 6)(因为父节点是 6,左子树最大值为 6)
  • 验证:3 在范围内 
  • 下一步:验证左子树 (2) 和右子树 (5)

左子树的左子树(节点 2)

调用  BST(2, LONG_MIN, 3)
  • 节点值:2
  • 合法范围:(-∞, 3)(父节点是 3,左子树最大值为 3)
  • 验证:2 在范围内 
  • 节点 2 的左右子树均为空,返回 true

左子树的右子树(节点 5)

调用  BST(5, 3, 6)
  • 节点值:5
  • 合法范围:(3, 6) (父节点是 3,右子树最小值为 3;祖父节点是 6,左子树最大值为 6)
  • 验证:5 在范围内 ✅
  • 节点 5 的左右子树均为空,返回 true
  • 左子树 (3) 的验证结果:true && true = true

右子树验证(节点 8)

调用  BST(8, 6, LONG_MAX)
  • 节点值:8
  • 合法范围:(6, +∞)(父节点是 6,右子树最小值为 6)
  • 验证:8 在范围内 ✅
  • 下一步:验证左子树 (7) 和右子树 (9)

右子树的左子树(节点 7)

调用 BST(7, 6, 8)
  • 节点值:7
  • 合法范围:(6, 8)(父节点是 8,左子树最大值为 8;祖父节点是 6,右子树最小值为 6)
  • 验证:7 在范围内 ✅
  • 节点 7 的左右子树均为空,返回 true

右子树的右子树(节点 9)

调用  BST(9, 8, LONG_MAX)
  • 节点值:9
  • 合法范围:(8, +∞)(父节点是 8,右子树最小值为 8)
  • 验证:9 在范围内 ✅
  • 节点 9 的左右子树均为空,返回 true
  • 右子树 (8) 的验证结果:true && true = true

验证结果

根节点的验证结果:左子树结果 && 右子树结果 = true && true = true 因此该树是有效的二叉搜索树

关键细节解析

  1. 范围约束机制每个节点的取值范围由整条祖先路径共同决定,例如节点 5 的范围 (3,6) 同时受父节点 3 和祖父节点 6 的约束。

  2. 数据类型选择

    • 使用long long而非int作为范围边界类型;
    • 避免当节点值为 INT_MAX 或 INT_MIN 时出现的溢出问题(如节点值为INT_MAX时,其父节点的 max 若为INT_MAX会导致判断错误);
  3. 严格不等式

    • 条件root->val >= max || root->val <= min确保了 BST 中不允许存在相等的值;
    • 符合二叉搜索树 "严格小于 / 大于" 的定义;
http://www.dtcms.com/a/414216.html

相关文章:

  • CentOS7安装部署K8s
  • 【无标题】使用 Playwright 实现跨 Chromium、Firefox、WebKit 浏览器自动化操作
  • 做网站能用思源黑体吗国内外网站网站
  • 基于Qt的跨平台Word文档导出器WordEx的设计与实现
  • LeetCode 0812.最大三角形面积:三角形面积公式考察
  • LeetCode热题100--994. 腐烂的橘子--中等
  • 杭州做网站优化wordpress整站加密
  • 用Spark+Django打造食物营养数据可视化分析系统
  • 个人用云计算学习笔记 --17(DNS 服务器)
  • 泛微 Ecology10 OA 系统介绍
  • 哪个网站可以直接做ppt上海网站免费制作
  • STM32CubeMX安装教程
  • 游戏引擎以及游戏开发
  • 使用Python实现自动编写Word全自动化系统
  • 用flash做的经典网站微信公众号制作平台
  • OpenAI正式推出GPT-5-Codex增强型AI编程助手,该工具专为软件工程师设计
  • SpringMVC 进阶:核心组件详解与参数绑定全攻略
  • SpringMVC 实战:整合 MyBatis 实现完整 CRUD
  • Interleaving-Reasoning-Generation - 交错推理生成技术
  • 【C++】:继承全面解析
  • 大良营销网站建设机构设计专业所需网站
  • Spark专题-第二部分:Spark SQL 入门(8)-算子介绍-sort
  • 知识体系_分布式内存计算框架_spark
  • 银行 网站开发 干什么wordpress路径错误
  • QML 语法基础详解
  • ExcelVBA一键生成智能散点趋势图
  • ✨WPF编程基础【1.4】:类型转换器(含示例及源码)
  • 公链分析报告 - 模块化区块链2
  • 数图实战项目(十五-2:第一阶段:从RAW数据到ISP管道,听不懂在说啥?---> 那就盘它):从奥运大屏,到手机小屏,快来挖一挖里面都有什么
  • 网站开发常见面试东莞网站优化关键词推广