leetcode 98 验证二叉搜索树

这篇博客讨论了两种方法来验证一个二叉树是否是有效的二叉搜索树。首先,介绍了递归解决方案,它在额外空间复杂度为O(1)的情况下工作,但避免使用全局变量。然后,更新了方案,指出全局变量在这种情况下是可以接受的,并展示了如何正确使用。最后,提出了一种迭代的中序遍历方法,通过栈来实现,将节点值存入容器并检查顺序以确定树的合法性。
摘要由CSDN通过智能技术生成

递归写法,额外空间复杂度为O(1)级别,

premax原本是想写成全局变量,结果本地控制台编译通过,提交出错,尽量还是少用全局变量。

class Solution {
public:
    
    bool isValidBST(TreeNode* root) {
      
        long long premax=LLONG_MIN;
        
        return bianli(root,premax);
    }
    bool bianli(TreeNode *root,long long &premax){
        if(root==NULL)
            return true;
        
        bool isbstleft=bianli(root->left,premax);
        
        if(isbstleft==false)
            return false;
        if(premax>=root->val)
            return false;
        else
            premax=root->val;
        
        
        return bianli(root->right,premax);
        

    }
};

更新 :这道题全局变量可以使用,之前不会用,导致错误。

class Solution {
private:
    long long premax=LLONG_MIN;
public:
bool isValidBST(TreeNode* root) {
  
    //long long premax=LLONG_MIN;
    
    return bianli(root);
}
bool bianli(TreeNode *root){
    if(root==NULL)
        return true;
    
    bool isbstleft=bianli(root->left);
    
    if(isbstleft==false)
        return false;
    if(premax>=root->val)
        return false;
    else
        premax=root->val;
    
    
    return bianli(root->right);
    

}
};

迭代中序遍历方法,利用栈完成中序遍历,弹出时压入容器。

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        
        stack<TreeNode*>temp;
        vector<int> ans;
        TreeNode*cur=root;
       // temp.push(root);
        while(!temp.empty()||cur){
            if(cur==NULL){
                cur=temp.top()->right;
                ans.push_back(temp.top()->val);
                
                temp.pop();

            }else{
                temp.push(cur);
                cur=cur->left;
            }

        }
        for(int i=1;i<ans.size();i++){
            if(ans[i]<=ans[i-1])
                return false;

        }

        return true;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值