【1086 25 树的转化】 Tree Traversals Again
传送门
题意
给定\(n\)个节点的一个树,以及的这个树中序出栈过程共\(2n\)次出入,求出这个树的后序序列
数据范围
\(n\leq 30\)
题解
- 中序栈访问,入栈序列即前序,出栈为中序
- 递归获得后序即可
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<int>pre,in,post;
void get_post(int root,int l,int r){
if(l>r) return;
int mid=l;
while(in[mid]!=pre[root]) mid++;
int lsz=mid-l;
get_post(root+1,l,mid-1);
get_post(root+1+lsz,mid+1,r);
post.push_back(in[mid]);
}
int main(){
stack<int>stk;
int n; cin>>n;
for(int i=0;i<2*n;i++){
string op; cin>>op;
if(op=="Push"){
int x; cin>>x;
pre.push_back(x);
stk.push(x);
} else {
int x=stk.top(); stk.pop();
in.push_back(x);
}
}
get_post(0,0,n-1);
for(int i=0;i<n;i++) cout<<(i?" ":"")<<post[i];
}

浙公网安备 33010602011771号