根据后序遍历中序遍历建树,然后输出层序遍历,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
struct node {
int val;
node *lchild, *rchild;
};
int ok = 0;
int post[40], in[40];
map<int, int> mp;
node* create(int postl, int postr, int inl, int inr) {
if (postl > postr) return NULL;
node* root = new node;
root->val = post[postr];
int k = mp[post[postr]];
int numleft = k - inl;
root->lchild = create(postl, postl + numleft - 1, inl, k - 1);
root->rchild = create(postl + numleft, postr - 1, k + 1, inr);
return root;
}
void layerorder(node* root) {
queue<node*> q;
q.push(root);
while (!q.empty()) {
node* now = q.front();
q.pop();
if (ok++) cout << " ";
cout << now->val;
if (now->lchild) q.push(now->lchild);
if (now->rchild) q.push(now->rchild);
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> post[i];
}
for (int i = 0; i < n; i++) {
cin >> in[i];
mp[in[i]] = i;
}
node* root = create(0, n - 1, 0, n - 1);
layerorder(root);
return 0;
}