代码随想录——二叉树23、验证二叉搜索树

image
image

根据定义递归

image

class Solution {
public:
    bool dfs(TreeNode* root,long long lower,long long upper){
        if(root == nullptr)return true;
        if(root->val <= lower || root->val >= upper)return false;
        return dfs(root->left,lower,root->val) && dfs(root->right,root->val,upper);
    }
    bool isValidBST(TreeNode* root) {
        return dfs(root,LONG_MIN,LONG_MAX);
        // //这是类似平衡二叉树的判断方法,搜索二叉树行不通
        // if(root == nullptr)return true;
        // if(root->left != nullptr && root->left->val >= root->val)return false;
        // else if(root->right != nullptr && root->right->val <= root->val)return false;
        // return isValidBST(root->left) && isValidBST(root->right);

    }
};

中序遍历

中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了

可以使用一个变量记录最大值/上一个节点的值,若当前节点小于等于它就返回false。而本题节点val最小为INT_MIN,所以变量初始化只能为LONG_MIN(若也为INT_MIN则假设只有一个节点,val就是INT_MIN,本应是true却判为false)

若题目进一步将val最小改为LONG_MIN,不可能再初始化一个更小的值了。所以为了避免初始化,如下方法取到最左面节点的数值来比较。

class Solution {
public:
    TreeNode* pre = nullptr;
    bool isValidBST(TreeNode* root) {
        if(root == nullptr)return true;
        bool left = isValidBST(root->left);

        if(pre != nullptr && pre->val >= root->val)return false;
        pre = root;

        bool right = isValidBST(root->right);
        return left && right;
    }
};
posted @   NeroMegumi  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示