Leetcode 98. 验证二叉搜索树

在这里插入图片描述
在这里插入图片描述解法1. upperlimit, lowerlimit在递归中怎么处理

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(root==NULL) return true;
        if(root->left!=NULL){
            if(root->left->val>=root->val)
            return false; //这条语句既检查root,又在递归中检查root
            upperlimit=root->left->val;
        }
        if(root->right!=NULL){
            if(root->val>=root->right->val||root->right->val>upperlimit) 
                return false;
            lowerlimit=root->right->val;
        else return isValidBST(root->left)&&isValidBST(root->right);  //递归进入左子树,左子树,
    }
};

解法2:设置了lowerlimit,upperlimit,但当结点value是INT_MIN, INT_MAX处理出错。
办法1,把最初lowerlimit, upperlimit设置成long int
办法2,不涉及long int情况下,把结点value为INT_MIN, INT_MAX时具体分类。

class Solution {
public: //记录两级前继节点, root->left, root->right分开
    bool isValidBST(TreeNode* root) {
        if(root==NULL) return true;
        int ul=root->val;
        int ll=root->val;
        if(root->left!=NULL){
            if(root->left->val>=root->val)
            return false;
        }
        if(root->right!=NULL){
            if(root->val>=root->right->val) 
            return false;
        }
        return isValid(root->left,  INT_MIN-1 ,ul)&&isValid(root->right,ll,INT_MAX+1);
    } 
       //递归进入左子树,左子树,        
        bool isValid(TreeNode* root, long int lowerlimit, long int upperlimit){
        if(root==NULL) return true;  //if(root)  member access within null pointer of type 'struct TreeNode'
        if(root->left!=NULL){
            if(root->left->val>=root->val||root->left->val<=lowerlimit)
            return false; //这条语句既检查root,又在递归中检查root
        }         
   //     else return isValid(root->left,lowerlimit,root->val)&&isValid(root->right,root->val,upperlimit);
        if(root->right!=NULL){
            if(root->right->val<=root->val||root->right->val>=upperlimit) 
                return false;
     //       else return isValid(root->left,lowerlimit,root->val)&&isValid(root->right,lowerlimit,upperlimit); 
        }
            return isValid(root->left,lowerlimit,root->val)&&isValid(root->right,root->val,upperlimit); 
    }
  
};

左子树更新节点值为upperlimit, lowerlimit不变
右子树更新节点值为lowerlimit, upperlimit不变

class Solution {
public: //记录两级前继节点, root->left, root->right分开
    bool isValidBST(TreeNode* root) {
        if(root==NULL) return true;
        int ul=root->val;
        int ll=root->val;
        bool min=false;
        bool max=false;
        if(root->val==INT_MIN) min=true;
        if(root->val==INT_MAX) max=true;
        if(root->left!=NULL){
            if(root->left->val>=root->val||min==true)
            return false;
        }
        if(root->right!=NULL){
            if(root->val>=root->right->val||max==true) 
            return false;
        }
        return isValid(root->left, INT_MIN,ul,min,max)&&isValid(root->right,ll,INT_MAX,min,max);
    } 
       //递归进入左子树,左子树,        
        bool isValid(TreeNode* root, int lowerlimit, int upperlimit, bool min,bool max){
        if(root==NULL) return true;  //if(root)  member access within null pointer of type 'struct TreeNode'
        if(root->val==INT_MIN) min=true; //分情况判断最小值,最大值是否出现
        if(root->val==INT_MAX) max=true;
        if(root->left!=NULL){
            if(min==true){
                 if(root->left->val>=root->val||root->left->val<=lowerlimit)
            return false;
            }
            else{
                if(root->left->val>=root->val||(root->left->val<=lowerlimit&&lowerlimit!=INT_MIN))
            return false;
            }
            //这条语句既检查root,又在递归中检查root
        }         
        if(root->right!=NULL){
            if(max==true){
                if(root->right->val<=root->val||root->right->val>=upperlimit) 
                return false;
            }
            else{
                if(root->right->val<=root->val||(root->right->val>=upperlimit&&upperlimit!=INT_MAX)) 
                return false;
            }
        }
    return isValid(root->left,lowerlimit,root->val,min,max)&&isValid(root->right,root->val,upperlimit,min,max); 
        }
  
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值