class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
//二叉搜索树的后序遍历的特征,左右根
//往前找,第一个比它小的是它的左子树,第一个比它大的是它的右子树。
if(sequence.size() == 0)return false;
if(sequence.size() == 1)return true;
int length = sequence.size();
return find_in_order(sequence,length-1,0);
}
bool find_in_order(vector<int> sequence,int index,int start){
if(index == start) return true;
int left,right = -1;
for(int i = index - 1;i >= start;i--){//往前找,第一个比它大的是它的右子树
if(sequence.at(i) > sequence.at(index)){
right = i;
break;
}
}
for(int j = index - 1;j >= start;j--){//往前找,第一个比它小的是它的左子树
if(sequence.at(j) < sequence.at(index)){
left = j;
break;
}
}
bool left_area,right_area = true;
if(left != -1){
left_area = if_small(sequence,start,left,sequence.at(index));
if(right != -1){//左右子树都有
right_area = if_large(sequence,left+1,right,sequence.at(index));
if(!left_area || !right_area)return false;
return find_in_order(sequence,left,start) && find_in_order(sequence,right,left+1);
}//right!=-1
else{//只有左子树
if(!left_area)return false;
return find_in_order(sequence,left,start);
}
}//left!=-1
else{//只有右子树
if(right != -1){
right_area = if_large(sequence,start,right,sequence.at(index));
if(!right_area)return false;
return find_in_order(sequence,right,start);
}
}
}
bool if_small(vector<int> sequence, int start, int end,int val){
for(int i = start;i<=end;i++){
if(sequence.at(i)>val)return false;
}
return true;
}
bool if_large(vector<int> sequence, int start, int end,int val){
for(int i = start;i<=end;i++){
if(sequence.at(i)<val)return false;
}
return true;
}
};