解题思路:
1 递归,借助中序遍历
class Solution {
public:
unordered_map<int,int>m;
bool VerifySquenceOfBST(vector<int> sequence) {
int n=sequence.size();
if(n==0)return false;
//获得中序序列
vector<int> inordered(sequence);
sort(inordered.begin(),inordered.end());
return help(inordered,sequence,0,n-1,0,n-1);
}
//有一个错就返回false,所以用&&
bool help(vector<int>& inOrdered,vector<int>& postOrdered,
int in_left,int in_right,int post_left,int post_right)
{
if(in_left>in_right)return true;
int index=-1;
for(int i=in_left;i<=in_right;++i){
if(inOrdered[i]==postOrdered[post_right]){
index=i;
break;
}
}
//假如没找到,返回false
if(-1==index)return false;
int right_count=in_right-index;
bool flag1=help(inOrdered,postOrdered,in_left,index-1,post_left,post_right-right_count-1);
bool flag2=help(inOrdered,postOrdered,index+1,in_right,post_right-right_count,post_right-1);
return flag1&&flag2;
}
};
2 借助栈的压入、弹出序列
好方法!
因为把中序序列作为栈的一个压入序列,那么后序序列是该栈的一个弹出序列。