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

LeetCode 热题 100 98. 验证二叉搜索树

LeetCode 热题 100 | 98. 验证二叉搜索树

大家好,今天我们来解决一道经典的二叉树问题——验证二叉搜索树。这道题在 LeetCode 上被标记为中等难度,要求判断给定的二叉树是否是一个有效的二叉搜索树(BST)。


问题描述

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点数目范围在 [1, 10^4]
  • -2^31 <= Node.val <= 2^31 - 1

解题思路

核心思想
  1. 递归验证

    • 使用递归方法,为每个节点维护一个取值范围 [min_val, max_val]
    • 对于根节点,其取值范围为 (-∞, +∞)
    • 对于左子树,更新上界为父节点的值;对于右子树,更新下界为父节点的值。
    • 如果某个节点的值超出其允许范围,则该树不是有效的二叉搜索树。
  2. 中序遍历

    • 二叉搜索树的中序遍历结果是一个严格递增的序列。
    • 在中序遍历过程中,维护一个全局变量 prev,记录前一个访问的节点值。
    • 如果当前节点值小于等于 prev,则该树不是有效的二叉搜索树。
递归验证方法
class Solution:def isValidBST(self, root: TreeNode) -> bool:def validate(node, low=float('-inf'), high=float('inf')):if not node:return Trueif not (low < node.val < high):return Falsereturn (validate(node.left, low, node.val) andvalidate(node.right, node.val, high))return validate(root)
中序遍历方法
class Solution:def isValidBST(self, root: TreeNode) -> bool:self.prev = float('-inf')def inorder_traversal(node):if not node:return Trueif not inorder_traversal(node.left):return Falseif node.val <= self.prev:return Falseself.prev = node.valreturn inorder_traversal(node.right)return inorder_traversal(root)

复杂度分析

  • 时间复杂度:O(n),其中 n 是树中节点的数量。每个节点恰好被访问一次。
  • 空间复杂度:O(h),其中 h 是树的高度。递归调用栈的深度最多为树的高度。

示例运行

示例 1
输入:root = [2,1,3]
输出:true
示例 2
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

总结

通过递归验证或中序遍历,我们可以高效地判断一个二叉树是否为有效的二叉搜索树。递归验证方法通过维护每个节点的取值范围来确保其符合BST的性质,而中序遍历方法则利用BST中序遍历结果为严格递增序列的特性。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

http://www.xdnf.cn/news/5445.html

相关文章:

  • NOR Flash与NAND Flash详解
  • 添加文字标签
  • 第六天:Java数组
  • 最长字符串 / STL+BFS
  • JDS-算法开发工程师-第9批
  • 如何通过管理Windows服务加速电脑启动?
  • TikTok 推广干货:AI 加持推广效能
  • java.util.Timer
  • pycharm更改终端为wsl.exe
  • stm32测频率占空比最好的方案
  • 多智体具身人工智能:进展与未来方向(下)
  • 【计算机视觉】基于Python的相机标定项目Camera-Calibration深度解析
  • 【TI MSPM0】CCS工程管理
  • 雷达工程师面试题目
  • 机械物理:水力发电站工作原理是什么?
  • 最大化效率和性能:AKS 中节点池的强大功能
  • 设计模式简述(十八)享元模式
  • 找银子 题解(c++)
  • EdgeOne Pages MCP 入门教程
  • 午前下单晚饭前到?亚马逊在珀斯实现!
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十六)
  • 【并发编程】Redisson 的分布式锁
  • 基于大核感知与非膨胀卷积的SPPF改进—融合UniRepLK的YOLOv8目标检测创新架构
  • [Java实战]Spring Boot 整合 Thymeleaf (十)
  • c++的模板和泛型编程
  • C++:流插入、流提取操作符
  • Java volatile关键字深度解析与源码实现
  • 极新携手火山引擎,共探AI时代生态共建的破局点与增长引擎
  • 解锁c++模板:从入门到精通
  • vue 中的数据代理