根据两个遍历建树,把同一深度的节点从左到右存入一个vector,然后根据题意输出。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<map>
#include<string>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
using namespace std;
int N;
int in[50], post[50];
vector<int> ls[50];//每一层的节点(从左到右
void solve(int l1, int r1, int l2, int r2, int depth) {
if (l1 > r1) return;
int rt = post[r2];
ls[depth].push_back(rt);
int pos = l1;
while (in[pos] != rt) ++pos;
solve(l1, pos - 1, l2, l2 + pos - l1 - 1, depth + 1);
solve(pos + 1, r1, l2 + pos - l1, r2 - 1, depth + 1);
}
int main()
{
#ifdef LIU
FILE *ss;
freopen_s(&ss, "1.txt", "r", stdin);
#endif
cin >> N;
for (int i = 0; i < N; i++)cin >> in[i];
for (int i = 0; i < N; i++)cin >> post[i];
solve(0, N - 1, 0, N - 1, 0);
cout << ls[0][0];//根
int l=1;
while (ls[l].size() > 0)
{
if (l%2) {//l是奇数,从左到右
for (int i = 0; i < ls[l].size(); i++)
cout << ' ' << ls[l][i];
}
else {//从右向左输出
for (int i = ls[l].size() - 1; i >= 0; i--)
cout << ' ' << ls[l][i];
}
l++;
}
cout << endl;
return 0;
}