思路:
1.按照栈的顺序得到的是中序遍历
2.按照顺序读入的是前序遍历
3.重新构建树,然后后续输出就可以了。
#include<iostream>
#include<stack>
#include<unordered_map>
#include<sstream>
using namespace std;
const int N=40;
int inorder[N],postorder[N],preorder[N];
int n,pren,inn,postn;
unordered_map<int,int> pos,l,r;
int build(int il,int ir,int pl,int pr){
int root=preorder[pl];
int k=pos[root];
if(k>il) l[root]=build(il,k-1,pl+1,pl+1+k-1-il);
if(k<ir) r[root]=build(k+1,ir,pl+1+k-1-il+1,pr);
return root;
}
void traversal(int root){
if(l.count(root)!=0) traversal(l[root]);
if(r.count(root)!=0) traversal(r[root]);
postorder[postn++]=root;
}
int main(){
cin>>n;
getchar();
string s;
stack<int> stk;
while(1){
if(!getline(cin,s)||s.size()==0) break;
stringstream ssin(s);
string info;
ssin>>info;
if(info=="Push"){
int x;
ssin>>x;
stk.push(x);
preorder[pren++]=x;
}
else{
inorder[inn++]=stk.top();
stk.pop();
}
}
for(int i=0;i<n;i++){
pos[inorder[i]]=i;
}
int root=build(0,n-1,0,n-1);
traversal(root);
cout<<postorder[0];
for(int i=1;i<n;i++) cout<<" "<<postorder[i];
return 0;
}