【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];
}
posted @ 2021-03-06 20:09  Hyx'  阅读(55)  评论(0)    收藏  举报