本题目要求用先序序列和中序序列构造一棵二叉树(树中结点个数不超过10个),并输出其后序序列。
输入格式:
在第一行中输入元素个数。
第二行中输入先序序列,用空格分隔。
第三行中输入中序序列,用空格分隔。
输出格式:
输出此二叉树的后序序列,用空格分隔,最后也有一个空格。
输入样例:
5
10 20 30 40 50
20 10 40 30 50
输出样例:
20 40 50 30 10
代码实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode* buildTree(int* preorder, int preStart, int preEnd, int* inorder, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) {
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = preorder[preStart];
int inRootIndex;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == root->val) {
inRootIndex = i;
break;
}
}
int leftSize = inRootIndex - inStart;
root->left = buildTree(preorder, preStart + 1, preStart + leftSize, inorder, inStart, inRootIndex - 1);
root->right = buildTree(preorder, preStart + leftSize + 1, preEnd, inorder, inRootIndex + 1, inEnd);
return root;
}
void postOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%d ", root->val);
}
int main() {
int n;
scanf("%d", &n);
int* preorder = (int*)malloc(n * sizeof(int));
int* inorder = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &preorder[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &inorder[i]);
}
TreeNode* root = buildTree(preorder, 0, n - 1, inorder, 0, n - 1);
postOrderTraversal(root);
printf(" ");
return 0;
}