题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解析
每次判断一个结点的左右子树是否左边全小于结点,右边全大于结点,然后递归判断两个子节点的情况。
每次选择的节点都是后序遍历的最后一个结点,也就是根节点。
class Solution {
public:
void method(vector<int> sequence, bool& flag){
int length = sequence.size();
if(length==0 || length==1)return;
int temp = sequence[length-1];
int f = 0,leftlength = -1;
for(int i=0;i<length-1;i++){
if(sequence[i]>temp && f==0){
leftlength = i;
f = 1;
}
if(f==1 && sequence[i]<temp){
flag = false;
return;
}
}
vector<int> left,right;
if(leftlength==-1){//无右子树
left.assign(sequence.begin(),sequence.end()-1);
method(left, flag);
}else if(leftlength==0){//无左子树
right.assign(sequence.begin(),sequence.end()-1);
method(right, flag);
}else{
left.assign(sequence.begin(), sequence.begin()+leftlength);
right.assign(sequence.begin()+leftlength+1, sequence.end()-1);
method(left, flag);
method(right, flag);
}
}
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size()==0)return false;
bool result = true;
method(sequence, result);
return result;
}
};