98. 验证二叉搜索树【 力扣(LeetCode) 】

文章目录

零、原题链接

98. 验证二叉搜索树

一、题目描述

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

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

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

二、测试用例

示例 1:

cpp 复制代码
输入:root = [2,1,3]
输出:true

示例 2:

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

提示:

cpp 复制代码
树中节点数目范围在[1, 104] 内
-2^31 <= Node.val <= 2^31 - 1

三、解题思路

  1. 基本思路:
      二叉搜索树中序遍历是有序序列,反过来也是正确的,即二叉树的中序遍历为有序序列,则该二叉树是二叉搜索树;所以只要检查二叉树的中序遍历是否有序即可。
  2. 具体思路:
    • 节点为空,返回 true ;
    • 左子树不是二叉搜索树,或者当前节点的值小于等于其前驱,返回 false
    • 更新前驱值为当前节点的值,用于后继节点使用;
    • 根据右子树是否为二叉搜索树来返回结果。

四、参考代码

时间复杂度: O ( n ) \Omicron(n) O(n)

空间复杂度: O ( h ) \Omicron(h) O(h)

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
#include <limits.h>
class Solution {
public:
    long int last = LONG_MIN;
    bool isValidBST(TreeNode* root) {
        if (!root)
            return true;

        if (!isValidBST(root->left) || root->val <= last)
            return false;

        last = root->val;

        return isValidBST(root->right);
    }
};
相关推荐
罗湖老棍子1 小时前
Biorhythms(信息学奥赛一本通- P1639)
算法·数论·裴蜀定理·扩展欧几里得·扩展中国剩余定理
程序喵大人6 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
奋发向前wcx7 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
by209998 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
念何架构之路9 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
晒太羊的猫10 小时前
hot100动态规划刷题
算法·动态规划
weixin_5310946911 小时前
heap_4内存管理
java·开发语言·算法
余额瞒着我当琳11 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
程序员南飞11 小时前
win系统安装minio
java·数据结构·算法
青少儿编程课堂11 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛