在屏幕上分别输入按先序,中序,后序序列建立的二叉树对应二叉链表,请用c语言分别还原原来的二叉树
时间: 2024-04-16 16:28:25 浏览: 80
当用户按照先序、中序和后序序列的顺序输入二叉树节点的值时,我们可以使用C语言编写一个程序来还原原始的二叉树。以下是一个示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点结构
struct Node {
int data;
struct Node* left;
struct Node* right;
};
// 根据先序和中序序列构建二叉树
struct Node* buildTree(int* preorder, int* inorder, int start, int end) {
static int preIndex = 0;
if (start > end) {
return NULL;
}
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = preorder[preIndex++];
newNode->left = NULL;
newNode->right = NULL;
if (start == end) {
return newNode;
}
int inIndex;
for (int i = start; i <= end; i++) {
if (inorder[i] == newNode->data) {
inIndex = i;
break;
}
}
newNode->left = buildTree(preorder, inorder, start, inIndex - 1);
newNode->right = buildTree(preorder, inorder, inIndex + 1, end);
return newNode;
}
// 后序遍历二叉树
void postorderTraversal(struct Node* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->data);
}
int main() {
int preorder[] = {1, 2, 4, 5, 3};
int inorder[] = {4, 2, 5, 1, 3};
int size = sizeof(preorder) / sizeof(preorder[0]);
struct Node* root = buildTree(preorder, inorder, 0, size - 1);
printf("Postorder traversal of the reconstructed tree: ");
postorderTraversal(root);
printf("\n");
return 0;
}
```
在这个示例代码中,我们首先定义了二叉树的节点结构 `Node`,其中包含数据 `data`、左子节点 `left` 和右子节点 `right`。
然后,我们使用 `buildTree` 函数根据先序和中序序列来构建二叉树。该函数通过递归的方式,首先根据先序序列中的元素构建节点,然后在中序序列中找到该节点的位置,以此划分左子树和右子树,并递归地构建子树。
最后,我们定义了 `postorderTraversal` 函数用于后序遍历重建后的二叉树,并输出遍历结果。
在 `main` 函数中,我们定义了先序和中序序列,并调用 `buildTree` 函数来构建二叉树。然后,我们调用 `postorderTraversal` 函数来后序遍历重建后的二叉树,并输出结果。
请注意,这只是一个示例程序,使用了固定的先序和中序序列。你可以根据具体输入进行修改和适配。希望对你有帮助!如果还有其他问题,请随时提问。
阅读全文