一开始想法是直接建个树 bfs把每层的节点都放到对应层数的一个vector里面 然后输出处理
但是看了网上的一些代码 自己改进了下
可以直接在后序中序建树的这个过程中就把相应层数的节点放在vector 并且我们关注的是各层的节点 重点是各层 并不需要知道各个节点的孩子节点和父母的关系 所以不用建树
#include <cstdio>
#include <unordered_map>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 50;
int in[maxn],post[maxn];
int n;
unordered_map<int,int> inpos;
vector<int> v[maxn];
struct Node{
int data;
Node* left;
Node *right;
int layer;
};
int depth=-1;
void create(int postL,int postR,int inL,int inR,int level)
{
if(postL>postR)
{
return ;
}
depth=max(level,depth);
v[level].push_back(post[postR]);
int k = inpos[post[postR]];
int numleft = k-inL;
create(postL,postL+numleft-1,inL,k-1,level+1);
create(postL+numleft,postR-1,k+1,inR,level+1);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&in[i]);
inpos[in[i]]=i;
}
for(int i=0;i<n;i++)
{
scanf("%d",&post[i]);
}
create(0,n-1,0,n-1,0);
bool z=true;
if(!v[0].empty())
printf("%d",v[0][0]);
for(int i=1;i<=depth;i++)
{
if(!z)
{
for(int j=v[i].size()-1;j>=0;j--)
printf(" %d",v[i][j]);
}
else
{
for(int j=0;j<v[i].size();j++)
printf(" %d",v[i][j]);
}
z = !z;
}
}