题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
我的实现: 递归
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size() == 0) return false;
if(sequence.size() == 1) return true;
int left = -1;
int right = -1;
int root = sequence[sequence.size()-1];
for(int i=0; i<sequence.size()-1; i++){
if(sequence[i] < root) left = i;
if(sequence[i] > root) right = i;
}
if(left == -1) {
vector<int> vr(sequence.begin(), sequence.begin()+right+1);
return VerifySquenceOfBST(vr);
}
if(right == -1) {
vector<int> vl(sequence.begin(),sequence.begin()+left+1);
return VerifySquenceOfBST(vl);
}
for(int i=0; i<=left; i++) {
if(sequence[i] > root) return false;
}
for(int i=left+1; i<=right; i++) {
if(sequence[i] < root) return false;
}//严格要求左子树元素全小于右子树
vector<int> vl(sequence.begin(),sequence.begin()+left+1);
vector<int> vr(sequence.begin()+left+1, sequence.begin()+right+1);
return VerifySquenceOfBST(vl) && VerifySquenceOfBST(vr);
}
};
大佬的实现:
严格要求左子树元素全小于右子树,且除根节点外恰好能分成两棵树(可空)
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if(0==size) return false;
int i = 0;
while(--size)
{
while(sequence[i++]<sequence[size]);
while(sequence[i++]>sequence[size]);
if(i<size)return false;
i=0;
}
return true;
}
};