【 每天学习一点算法 2025/12/17】验证二叉搜索树

每天学习一点算法 2025/12/17

验证二叉搜索树

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

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

节点的左子树只包含 小于 当前节点的数。

节点的右子树只包含 大于 当前节点的数。

所有左子树和右子树自身必须也是二叉搜索树。

  1. 根据题目描述可以知道二叉搜索树,使用中序遍历的结果数组一定是升序,也就是每一次遍历的节点值都比之前的大,我们只需要在遍历过程比较一下当前节点值是否符合要求即可。

    typescript 复制代码
    function isValidBST(root: TreeNode | null): boolean {
      const result: number[] = [] // 用于存储遍历值
      // 为了避免result全局污染添加一个辅助函数
      function validate(node: TreeNode | null): boolean {
        if (node === null) return true; // 初始默认为有效搜索二叉树
        // 提前中断已经无效的情况
        if (!validate(node.left)) {
          return false
        }
        // 判断当前节点是否符合二叉搜索树特征
        if (result.filter(item => item >= node.val).length > 0) return false
        result.push(node.val)
        // 提前中断已经无效的情况
        if (!validate(node.right)) {
          return false
        }
        return true
      }
      // 调用辅助函数
      return validate(root);
    };
  2. 之前的二叉树相关的题我们也提到了递归的每次一层的 root 其实就是当前子树的根节点,我们只需要在每一层的遍历中判断当前节点的值和子节点的大小关系即可知道这是否是有效的二叉搜索树。

    typescript 复制代码
    function isValidBST(root: TreeNode | null): boolean {
       // 辅助函数,增加上下界参数
      function validate(node: TreeNode | null, lower: number, upper: number): boolean {
        if (node === null) return true; // 终止时无超出上下界的结果为有效
    
        // 检查当前节点值是否超出上下界
        if (node.val <= lower || node.val >= upper) {
            return false;
        }
    
        // 递归检查左子树和右子树
        return validate(node.left, lower, node.val) && validate(node.right, node.val, upper);
      }
    
      // 调用辅助函数,初始上下界为负无穷到正无穷
      return validate(root, -Infinity, Infinity);
    };

题目来源:力扣(LeetCode)

相关推荐
小弥儿33 分钟前
GitHub今日热榜 | 2026-08-14:OSINT情报工具回流,本地AI赛道升温
人工智能·学习·开源·github
乐观勇敢坚强的老彭35 分钟前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
高洁0140 分钟前
工信部教考中心证书
人工智能·深度学习·算法·机器学习·知识图谱
小黄人软件1 小时前
【证书批量转换】PEM->CER证书批量转换工具.exe 纯 Python实现,无需安装OpenSSL
人工智能·学习
我变成萤火虫1 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
Dr.kangder1 小时前
嵌入式面试总结(十九)——内存泄露
单片机·算法·面试·职场和发展·架构·硬件架构
Herbert_hwt1 小时前
【C语言基础】常量、选择结构与运算符全解析
c语言·开发语言·算法
Suxing92 小时前
C语言基础分享:从“租房”到“拆迁”,C语言动态内存管理
java·数据结构·算法
peijiping2 小时前
Agent 工具执行:并行(parallel_tool_calls)和后台(run_in_background)到底有什么区别? (学习笔记)
笔记·学习·ai agent·claude code
何事误红尘2 小时前
KF32A学习笔记(二):IDE基本使用、srec和hex格式、FreeRTOS移植
学习