题意:给定建树的过程用栈表示,要求输出树的后序遍历
tip:已知前序中序,求后序
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
vector<int>pre,post,inorder;
void getpost(int l,int r,int root)
{
if(l>r)
return ;
int t=l;
for(int i=t;i<=r;++i)
if(pre[root]==inorder[i])
{
t=i;
break;
}
getpost(l,t-1,root+1);//左子树
getpost(t+1,r,root+1+t-l);//右子树
post.push_back(pre[root]);
}
int main() {
int n;
cin>>n;
stack<int>s;
for(int i=0; i<2*n; ++i) {
string a;
cin>>a;
if(a=="Push") {
int t;
cin>>t;//入栈序列就是前序遍历
pre.push_back(t);
s.push(t);
} else {//出栈序列就是中序遍历
inorder.push_back(s.top());
s.pop();
}
}
getpost(0,n-1,0);
cout<<post[0];
for(int i=1;i<post.size();++i)
cout<<" "<<post[i];
return 0;
}