1.后序+中序 确定层次遍历
2.用的是中序区间和后序区间来进行遍历(也可以用Tree Traversals (25分)中后序确定根结点+中序区间来做,因为后序区间也就可以判断根结点)
3.层次遍历看样例是第一行逆序,第二行正序,,以此类推 所以用vector来存储每行的节点 在判断是奇数层还是偶数层
#include<iostream>
#include<vector>
using namespace std;
const int N = 1000000+5;
int in[N], po[N];//中 后
vector<int> v[N];
int ans = 0;
void level(int il, int ir, int pol, int por, int l) {//先序遍历
// cout << il << " " << ir << endl;
if(il > ir) return;
int i;
for(i=il; i<=ir; i++) {
if(in[i] == po[por]) {
break;
}
}
// cout << "得到的pos"<< i << endl;
int num = i-il;//子树节点数
// cout << l << "所对应的:"<< po[por] << endl;
level(il, i-1, pol, pol+num-1, l+1);//左子树
v[l].push_back(po[por]);
level(i+1, ir, pol+num, por-1, l+1);//右子树
ans = max(ans, l);
}
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
cin >> in[i];//左右根
}
for(int i=0; i<n; i++) {
cin >> po[i];//左根右
}
level(0, n-1, 0, n-1, 0);
for(int i=0; i<=ans; i++) {
if(i%2) {
for(int j=0; j<v[i].size(); j++) {
n--;
printf("%d%c", v[i][j], " \n"[n==0]);
}
} else for(int j=v[i].size()-1; j>=0; j--) {
n--;
printf("%d%c", v[i][j], " \n"[n==0]);
}
}
return 0;
}