LeetCode 98.验证二叉搜索树

本文探讨了如何验证一个二叉树是否为有效的二叉搜索树,通过中序遍历的方法检查节点值的顺序性。提出了两种解决方案,一种是进行完整的中序遍历后检查数组的有序性,另一种是在遍历过程中实时比较当前节点与前一节点的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题来自:https://leetcode-cn.com/problems/validate-binary-search-tree/submissions/

二叉搜索树的主要特征就是:中序遍历元素有序

两种思路:

  1. 将整个树中序遍历一遍,把所有元素都储存下来,然后再线性扫一遍这个数组,看是否满足有序条件。TC:O(n),MC:O(n)。
  2. 想办法优化空间损耗,那就是边中序遍历边判断,中序遍历时每个元素都会比在中序遍历中前一个元素要大。于是,设一个pre全局变量,储存前一个元素,数据会卡int最小值,所以初始化的时候设个long的最小值LONG_MIN。

法2:

long pre = LONG_MIN;
bool isValidBST(TreeNode* root){
        if(!root) return true;
        //如果左子树都不满足了,就直接返回了 没必要判断根 和右子树了
        if(!isValidBST(root->left)) return false;

        if(root->val <= pre) return false;
        pre = root->val;

        return isValidBST(root->right);
    }

法1:

vector<int> InorderTraversal;
    bool isValidBST(TreeNode* root) {
        if(!root) return true;
        dfs(root);
        for(int i = 1;i < InorderTraversal.size();++i){
            if(InorderTraversal[i] <= InorderTraversal[i-1])
                return false;
        }
        return true;
    }

    void dfs(TreeNode* root){
        if(!root) return;
        dfs(root->left);
        InorderTraversal.push_back(root->val);
        dfs(root->right);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值