简单题,建树加层序遍历。
#include <bits/stdc++.h>
using namespace std;
struct node {
int data, level;
node *lchild, *rchild;
};
int pre[30], in[30];
map<int, int> mp;
node* create(int prel, int prer, int inl, int inr) {
if (prel > prer) return NULL;
node* root = new node;
root->data = pre[prel];
int k = mp[pre[prel]];
int numleft = k - inl;
root->lchild = create(prel + 1, prel + numleft, inl, k - 1);
root->rchild = create(prel + numleft + 1, prer, k + 1, inr);
return root;
}
void layerorder(node* root) {
queue<node*> q;
root->level = 0;
q.push(root);
int t = -1;
while (!q.empty()) {
node* now = q.front();
q.pop();
if (now->level != t) {
if (t != -1) printf(" ");
printf("%d", now->data);
t = now->level;
}
if (now->lchild) {
q.push(now->lchild);
now->lchild->level = now->level + 1;
}
if (now->rchild) {
q.push(now->rchild);
now->rchild->level = now->level + 1;
}
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &in[i]);
mp[in[i]] = i;
}
for (int i = 0; i < n; i++) {
scanf("%d", &pre[i]);
}
node* root = create(0, n - 1, 0, n - 1);
layerorder(root);
return 0;
}