【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);
    }
};
相关推荐
程序 代码狂人34 分钟前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade1 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
Xin7702 小时前
LeetCode 79. 单词搜索(DFS 回溯法)
leetcode
小郎君6583 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
CodeYp20194 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
邵奈一4 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS1004 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao4 小时前
算法56,重排链表
数据结构·算法·链表
pipixia200334 小时前
C++继承面试四连问:内存叠加、私有继承、sizeof、权限重映射
c++·面试·嵌入式·继承·面向对象·对象模型