C语言已知一棵二叉树有n个结点,给出先序遍历和中序遍历序列,编写构造一棵用二叉链表方式存储的二叉树.从键盘接受输入先序序列和中序序列,将遍历结果以树形输出
时间: 2024-05-13 13:15:14 浏览: 110
好的,我会帮你解决这个问题。这道题需要使用递归的方法来构建二叉树。首先,我们需要明确的是,先序遍历的第一个结点一定是二叉树的根节点。我们可以根据这个特性,将中序遍历序列分成左右两个子序列,左边的子序列是根节点的左子树的中序遍历序列,右边的子序列是根节点的右子树的中序遍历序列。然后,根据左右子序列的长度,我们可以在先序遍历序列中找到根节点的左子树和右子树的先序遍历序列。接下来,我们递归地构建左子树和右子树。
下面是实现这个算法的 C 代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct node {
char data;
struct node *left;
struct node *right;
} Node;
// 根据先序遍历序列和中序遍历序列构建二叉树
Node* buildTree(char *preorder, char *inorder, int len) {
if (len == 0) {
return NULL;
}
// 先序遍历的第一个结点是根节点
char rootValue = preorder[0];
Node *root = (Node*)malloc(sizeof(Node));
root->data = rootValue;
root->left = NULL;
root->right = NULL;
// 在中序遍历序列中找到根节点
int rootIndex = 0;
while (rootIndex < len && inorder[rootIndex] != rootValue) {
rootIndex++;
}
// 构建左子树
root->left = buildTree(preorder + 1, inorder, rootIndex);
// 构建右子树
root->right = buildTree(preorder + rootIndex + 1, inorder + rootIndex + 1, len - rootIndex - 1);
return root;
}
// 打印二叉树
void printTree(Node *root, int level) {
if (root == NULL) {
return;
}
printTree(root->right, level + 1);
for (int i = 0; i < level; i++) {
printf(" ");
}
printf("%c\n", root->data);
printTree(root->left, level + 1);
}
int main() {
char preorder[] = {'A', 'B', 'D', 'E', 'C', 'F'};
char inorder[] = {'D', 'B', 'E', 'A', 'F', 'C'};
int len = sizeof(preorder) / sizeof(preorder[0]);
Node *root = buildTree(preorder, inorder, len);
printTree(root, 0);
return 0;
}
```
这段代码首先定义了二叉树节点的结构体,然后实现了 `buildTree` 函数来构建二叉树。这个函数接受三个参数:先序遍历序列、中序遍历序列和序列的长度。在函数中,首先判断序列长度是否为 0,如果是,则返回 `NULL`。否则,取出先序遍历的第一个结点作为根节点,然后在中序遍历序列中找到根节点的位置,将中序遍历序列分成左右两个子序列。根据左右子序列的长度,可以在先序遍历序列中找到根节点的左子树和右子树的序列,然后递归地构建左子树和右子树。
最后,打印二叉树的函数 `printTree` 接受两个参数:根节点和当前节点的层数。这个函数使用递归的方式,先打印右子树,然后打印当前节点,并打印若干个空格,以便让当前节点的位置对齐。最后打印左子树。
希望这个代码可以帮助你完成这道题目。
阅读全文