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;
}