和用后序+中序得出前序序列的方法差不多
①设置level数组,大小设置大一些,因为30个节点可能在level数组中的下标就很大
②全部初始化为-1,表示没有节点
③设置index变量,表示当前根节点的下标位置
④往左更新,则inde=2index
往右更新,则index=2index+1;
⑤每次更新的时候,post[r1]则为当前根节点的值,写入level[index]即可
#include<iostream>
#include<iostream>
#include<cstdio>
using namespace std;
int n,post[35],in[35],level[100000];
void creat(int l1,int r1,int l2,int r2,int index)//index:当前根节点的下标位置
{
if(l1>r1) return;
int pos,len;
for(int i=l2;i<=r2;i++)
if(post[r1]==in[i]){
pos=i; break;
}
len=pos-l2;
level[index]=post[r1]; //将当前根节点post[r1]值写入level数组中
creat(l1,l1+len-1,l2,l2+len-1,2*index); //左侧:index=2*index
creat(l1+len,r1-1,l2+len+1,r2,2*index+1); //右侧:index=2*index+1
}
int main()
{
for(int i=0;i<100000;i++) level[i]=-1;
cin>>n;
for(int i=0;i<n;i++) cin>>post[i];
for(int i=0;i<n;i++) cin>>in[i];
creat(0,n-1,0,n-1,1);
int cnt=0;
for(int i=0;i<100000;i++){
if(level[i]!=-1){
cout<<level[i];
cnt++;
if(cnt!=n) cout<<" ";
}
}
return 0;
}