转自:与后序中序转换为前序的代码相仿(无须构造二叉树再进行广度优先搜索~~),只不过加一个变量index,表示当前的根结点在二叉树中所对应的下标(从0开始),所以进行一次输出先序的递归的时候,就可以把根结点下标所对应的值存储在level数组中(一开始把level都置为-1表示此处没有结点),这样在递归完成后level数组中非-1的数就是按照下标排列的层序遍历的顺序
#include <bits/stdc++.h>
using namespace std;
int level[10000]={
0};
int post[10000],in[10000],pre[10000];
void build(int begin_in,int begin_post,int begin_pre,int n,int index){if(!n) return;else{int i;int root=post[begin_post+n-1];pre[begin_pre]=root;level[index]=root;for(i=0;i<=n-1;i++){if(root==in[begin_in+i]) break;}int L=i;int R=n-i-1;build(begin_in,begin_post,begin_pre+1,L,index*2);build(begin_in+i+1,begin_post+L,begin_pre+i+1,R,index*2+1);}}
int main(){int t;cin>>t;memset(level,-1,sizeof(level));for(int i=0;i<=t-1;i++){cin>>post[i];}for(int i=0;i<=t-1;i++){cin>>in[i];}build(0,0,0,t,1);int flag=0;for(int i=0;i<10000;i++){if(level[i]!=-1){if(!flag){printf("%d", level[i]); flag=1;} else{printf(" %d",level[i] );}}}return 0;
}