题目
根据后序,中序建树,得出层序遍历,嗯很不错
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 35;
const int INF = 0x3f3f3f3f;
int n, maxlevel;//最大深度
int in[MAXN], post[MAXN]; //存储中序遍历、后续遍历
deque<int> level[MAXN]; //存储层序遍历
//root n-1
//left 0
//right n-1
//deep 1
void travel(int root, int left, int right, int deep){
//root 当前根节点
if(left > right)
return ;
int i = left;
//找到中序遍历中的根节点
while(i <= right && in[i] != post[root])
i++;
maxlevel = max(deep, maxlevel);
level[deep].push_back(post[root]);
travel(root - right + i - 1, left, i - 1, deep + 1); //遍历左子树
travel(root - 1, i + 1, right, deep + 1); //遍历右子树
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 0;i < n;i ++)//中序
cin >> in[i];
for(int i = 0;i < n;i ++)//后序
cin >> post[i];
maxlevel = 0; //记录最大深度
travel(n - 1, 0, n - 1, 1);
cout << "R:";
for(int i = 1;i <= maxlevel;i++){
cout << " " << level[i].back();
}
cout << endl << "L:";
for(int i = 1;i <= maxlevel;i++){
cout << " " << level[i].front();
}
return 0;
}