看起来复杂,其实实现还是比较简单的。
先用递归建树,然后用队列实现输出。下面的代码样例中忘了delete。
#include<cstdio>
#include<queue>
using namespace std;
#define maxn 35
struct node {
int data;
node *left, *right;
};
node* maketree(int postorder[], int postLeft, int postRight,
int inorder[], int inLeft, int inRight) {
if (postLeft >= postRight) {
return NULL;
}
node *root = new node;
root->data = postorder[postRight - 1];
root->left = NULL;
root->right = NULL;
int i;
for (i = inLeft; i < inRight; i++) {
if (root->data == inorder[i]) break;
}
int leftCount = i - inLeft;
root->left = maketree(postorder, postLeft, postLeft + leftCount, inorder, inLeft, i);
root->right = maketree(postorder, postLeft + leftCount, postRight - 1, inorder, i + 1, inRight);
return root;
}
void print(node *root, int N) {
queue<node*> q;
if (root == NULL) {
printf("no one\n");
return;
}
q.push(root);
int count = 0;
node* temp;
while(!q.empty()) {
temp = q.front();
q.pop();
printf("%d", temp->data);
count++;
if (count < N) printf(" ");
else printf("\n");
if (temp->left != NULL) q.push(temp->left);
if (temp->right != NULL) q.push(temp->right);
}
}
int main() {
int postorder[maxn], inorder[maxn];
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &postorder[i]);
}
for (int i = 0; i < N; i++) {
scanf("%d", &inorder[i]);
}
node *root = maketree(postorder, 0, N, inorder, 0, N);
print(root, N);
return 0;
}