【Hot 100 刷题计划】 LeetCode 98. 验证二叉搜索树 | C++ 指针边界法

LeetCode 98. 验证二叉搜索树

📌 题目描述

题目级别:中等

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

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

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

💡 破题思路:区间约束法 (自顶向下)

验证 BST 的最大陷阱是:不能只判断当前节点和它的左右孩子

比如 [5,4,6,null,null,3,7],节点 6 的左孩子是 3,虽然 3 < 6 局部成立,但 3 身处根节点 5 的右子树中,它必须大于 5

因此,我们需要自顶向下地传递一个合法区间 (min, max)

  1. 根节点的区间是 (-∞, +∞)
  2. 往左子树走时,当前节点的值就成了左子树的上限
  3. 往右子树走时,当前节点的值就成了右子树的下限

高光技巧(指针代替数值):

很多解法用 LONG_MIN 来初始化极小值,但如果节点值本身就是 long long 类型的下界呢?

最优的写法是使用 TreeNode* 指针来表示边界。如果指针为空,表示没有边界限制;如果指针有值,直接解引用比较。优雅且绝对不会溢出。


💻 C++ 代码实现 (指针边界版)

cpp 复制代码
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        // 初始状态:上下界均无限制 (nullptr)
        return dfs(root, nullptr, nullptr);
    }

    bool dfs(TreeNode* root, TreeNode* minN, TreeNode* maxN)
    {
        // 走到空节点,说明没有违反规则
        if (!root) return true;
        
        // 如果下界存在,且当前值没有严格大于下界,判负
        // 如果上界存在,且当前值没有严格小于上界,判负
        if ((minN && root->val <= minN->val) || (maxN && root->val >= maxN->val)) 
            return false;

        // 向左子树递归:下界不变,上界更新为当前节点
        // 向右子树递归:下界更新为当前节点,上界不变
        return dfs(root->left, minN, root) && dfs(root->right, root, maxN);
    }
};
相关推荐
hansang_IR1 分钟前
【代数与组合数学 | 那忘算 5】生成函数 & 例题 & 卷积
c++·算法·多项式·生成函数·母函数
Zane19944 分钟前
快速排序凭什么叫"快"排序?平均O(nlogn)背后,藏着一个能让它退化成O(n²)的选择
算法
无忧.芙桃8 分钟前
数据结构之排序算法(上):从评价指标到插入、希尔、选择与堆排序
c语言·c++·排序算法
syagain_zsx10 分钟前
算法基础篇 · 02 高精度(C++ 题解)
开发语言·c++·学习·高精度
6Hzlia12 分钟前
【Classic 150 刷题计划】 LeetCode 242. 有效的字母异位词 | C++ 哈希计数与严密防线
c++·算法·leetcode
wabs66614 分钟前
关于二叉树【力扣101.对称二叉树的思考】
数据结构·c++·算法·leetcode·二叉树
6Hzlia33 分钟前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 双游标区间扫描与 to_string 规范
c++·算法·leetcode
玖玥拾1 小时前
LeetCode 383 赎金信
算法·leetcode
维克兜率天1 小时前
5.3 宏观因子:抬头看天
笔记·python·深度学习·算法·量化
LuminousCPP1 小时前
数据结构-排序(五):计数排序与排序专题阶段总结|从外部归并到线性排序,再看算法边界与选型
c语言·数据结构·笔记·算法·排序算法