class Solution {
public:
bool isValidBST(TreeNode* root) {
if(root==NULL) return true;
int value1=0;
int value2=0;
bool res=is(root,value1,value2);
return res;
}
bool is(TreeNode * root,int & sum1,int & sum2){
if(root->left==NULL && root->right==NULL) {
sum1=root->val;
sum2=root->val;
return true;
}
int left_1=0;
int left_2=0;
int right_1=0;
int right_2=0;
bool left_=false;
bool right_=false;
if(root->left) left_=is(root->left,left_1,left_2);
if(root->right) right_=is(root->right,right_1,right_2);
if(root->left && root->right){
if(left_ && right_ && root->val>left_2 && root->val<right_1)
{
sum1=min(left_1,left_2);
sum2=max(right_1,right_2);
return true;
}else return false;
}else if(root->left){//只有左孩子
if(left_&&root->val>left_2){
sum1 = left_1;
sum2=root->val;
return true;
}else return false;
}else{//只有右孩子
if(right_&&root->val <right_1){
sum1 = root->val;
sum2 = right_2;
return true;
}else return false;
}
}
};
每个子树,自行判断,是否二叉搜索树,是返回true,否则返回false,如果是,要向上汇报两个值,一个是自己的最小值,一个是自己的最大值。这里比较麻烦的就是判断一棵树是否是二叉搜索树,分三种情况(1)左子树存在且右子树存在,根要比左子树的最大值大,并且比右子树的最小值小,然后向上汇报当前最大值等于右子树的最大值,当前最小值等于左子树的最小值;(2)左子树存在,根要大于左子树的最大值,向上汇报当前最大值等于根,最小值等于左子树最小值;(3)右子树存在,根要小于右子树最小值,向上汇报当前最大值等于右子树最大值,最小值等于根。如果左右子树都不存在,向上汇报最大最小值都等于根。