该题主要注意左子树的元素个数问题就好
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 10010;
struct node{
int data;
node *left, *right;
};
int n;
int in[maxn], post[maxn];
node* createTree(int inl, int inr, int posl, int posr) {
if(inl > inr) return NULL;
node *root = new node();
root->data = post[posr];
int k = inl;
for(k = inl; k <= inr; k++) {
if(in[k] == post[posr])
break;
}
int leftnum = k - inl;
//注意下标的传递
//左子树为posl, posl + leftnum - 1共计leftnum个元素
root->left = createTree(inl, k - 1, posl, posl + leftnum - 1);
root->right = createTree(k + 1, inr, posl + leftnum, posr - 1);
return root;
}
void bfs(node *root) {
queue<node *> q;
node *p = root;
q.push(p);
int cnt = 0;
while(!q.empty()) {
p = q.front();
q.pop();
cnt++;
printf("%d", p->data);
if(cnt != n) printf(" ");
if(p->left) q.push(p->left);
if(p->right) q.push(p->right);
}
}
int main()
{
node *root = NULL;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &post[i]);
}
for(int i = 0; i < n; i++) {
scanf("%d", &in[i]);
}
root = createTree(0, n - 1, 0, n - 1);
bfs(root);
return 0;
}