一開始想法是直接建個樹 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;
}
}