本题目要求用后序序列和中序序列构造一棵二叉树(树中结点个数不超过10个),并输出其先序序列。
输入格式:
在第一行中输入元素个数。
第二行中输入后序序列,用空格分隔。
第三行中输入中序序列,用空格分隔。
输出格式:
输出此二叉树的先序序列,用空格分隔,最后也有一个空格。
输入样例:
5
20 40 50 30 10
20 10 40 30 50
输出样例:
10 20 30 40 50
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 创建新节点
struct TreeNode* createNode(int val) {
struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
if (newNode == NULL) {
printf("Memory allocation failed\n");
exit(1);
}
newNode->val = val;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 根据后序和中序序列构建二叉树
struct TreeNode* buildTree(int* postorder, int postStart, int postEnd, int* inorder, int inStart, int inEnd) {
if (postStart > postEnd || inStart > inEnd) {
return NULL;
}
int root_val = postorder[postEnd];
struct TreeNode* root = createNode(root_val);
int inorder_index;
for (inorder_index = inStart; inorder_index <= inEnd; inorder_index++) {
if (inorder[inorder_index] == root_val) {
break;
}
}
int leftSubtreeSize = inorder_index - inStart;
root->left = buildTree(postorder, postStart, postStart + leftSubtreeSize - 1,
inorder, inStart, inorder_index - 1);
root->right = buildTree(postorder, postStart + leftSubtreeSize, postEnd - 1,
inorder, inorder_index + 1, inEnd);
return root;
}
// 输出二叉树的先序序列
void preorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main() {
int n;
scanf("%d", &n);
int postorder[n];
int inorder[n];
for (int i = 0; i < n; i++) {
scanf("%d", &postorder[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &inorder[i]);
}
struct TreeNode* root = buildTree(postorder, 0, n - 1, inorder, 0, n - 1);
preorderTraversal(root);
return 0;
}