L2-011 玩轉二叉樹 (25分)
AC代碼
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
int id, index, level;
};
vector<node> pre, in, op;
void Invert(int root, int start, int end, int index, int level){
if(start > end) return;
int i = start;
while (i < end && in[i].id != pre[root].id) i++;
op.push_back({pre[root].id, index, level});
Invert(root+i-start+1, i+1, end, index*2+1, level+1);
Invert(root+1, start, i-1, index*2+2, level+1);
}
bool cmp(node x, node y){
if (x.level != y.level) return x.level < y.level;
return x.index < y.index;
}
int main(){
int n, num;
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d", &num);
in.push_back({num, 0, 0});
}
for (int i = 0; i < n; i++){
scanf("%d", &num);
pre.push_back({num, 0, 0});
}
Invert(0, 0, n-1, 0, 0);
sort(op.begin(), op.end(), cmp);
printf("%d", op[0].id);
for (int i = 1; i < n; i++)
printf(" %d", op[i].id);
return 0;
}