解法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);
}
};