1.层次遍历
2.不一定是完全二叉树,所以level存储后输出要注意
3.由于不一定是完全二叉树,所以数组大小需要给够 不然会段错误 或者答案错误
除此之外 在先序遍历时存储,根结点需要注意找对。
#include<iostream>
using namespace std;
const int N = 1000000+5;
int in[N], po[N];//中 后
int level[N];
void pre(int root, int l, int r) {//先序遍历
if(l >= r) return;
int i;
for(i=l; i<r; i++) {
if(in[i] == po[root]) {
break;
}
}
printf("%d ", po[root]);
pre(root-(r-i), l, i);//左子树
pre(root-1, i+1, r);//右子树
}
void lev(int root, int l, int r, int idx) {
if(l >= r) return;
int i;
for(i=l; i<r; i++) {
if(in[i] == po[root]) {
break;
}
}
level[idx] = po[root];
// cout << level[idx] << endl;
lev(root-(r-i), l, i, idx*2+1);//左子树
lev(root-1, i+1, r, (idx+1)*2);//右子树
}
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
cin >> po[i];//左右根
}
for(int i=0; i<n; i++) {
cin >> in[i];//左根右
}
//pre(n-1, 0, n) ;//根 左边界 右边界
lev(n-1, 0, n, 0);
int i;
int cnt = 0;
for(i=0; cnt < n; i++) {
if(level[i]) {
if(cnt) {
cout << " ";
}
cout << level[i];
cnt ++;
}
}
cout <<endl;
return 0;
}