AcWing 1576. 1086 Tree Traversals Again (25分)
原题链接
简单
作者:
leo123456
,
2020-05-14 16:07:06
,
所有人可见
,
阅读 577
#include<iostream>
#include<cstring>
#include<stack>
#include<unordered_map>
using namespace std;
const int N=40;
int n;
int preorder[N],inorder[N],postorder[N];
int pre_i,in_i,post_i;
stack<int> S;
unordered_map<int,int> pos;
void build(int pl,int pr,int il,int ir)
{
int root=preorder[pl];
int k=pos[root];
//for(k=il;k<=ir;k++)
// if(inorder[k]==root) break;
if(il<k) build(pl+1,pl+1+(k-1-il),il,k-1);
if(k<ir) build(pl+1+(k-1-il)+1,pr,k+1,ir);
postorder[post_i++]=root;
return;
}
int main()
{
cin>>n;
int k=2*n;
getchar();
while(k--)
{
string s;
getline(cin,s);
if(s[1]=='u')
{
int a=stoi(s.substr(5));
preorder[pre_i++]=a;
S.push(a);
}
else
{
int b=S.top();
S.pop();
inorder[in_i++]=b;
}
}
for(int i=0;i<n;i++)
pos[inorder[i]]=i;
build(0,n-1,0,n-1);
cout<<postorder[0];
for(int i=1;i<n;i++)
cout<<' '<<postorder[i];
return 0;
}