用c语言链表实现 用顺序存储结构来存储一颗具有n个结点的二叉树,编写算法实现对该二叉树进行先序遍历,输出先序遍历序列。
时间: 2024-05-10 15:16:51 浏览: 136
首先,我们需要定义二叉树的顺序存储结构,可以使用数组来实现,具体定义如下:
```c
#define MAX_SIZE 100 // 最大结点数
typedef char ElemType; // 结点数据类型为字符型
typedef struct {
ElemType data[MAX_SIZE]; // 结点数据
int length; // 树的结点数
} SeqBinaryTree;
```
其中,`data` 数组用于存储二叉树的结点数据,`length` 表示二叉树的结点数。
接下来,我们可以定义先序遍历函数,使用递归的方式实现。
```c
void preOrder(SeqBinaryTree T, int index) {
if (index >= T.length || T.data[index] == '#') {
return; // 结点不存在或为空结点,直接返回
}
printf("%c ", T.data[index]); // 输出结点数据
preOrder(T, 2 * index + 1); // 遍历左子树
preOrder(T, 2 * index + 2); // 遍历右子树
}
```
在主函数中,我们可以先读入二叉树的结点数据,然后调用 `preOrder` 函数进行先序遍历输出。
完整代码如下:
```c
#include <stdio.h>
#define MAX_SIZE 100 // 最大结点数
typedef char ElemType; // 结点数据类型为字符型
typedef struct {
ElemType data[MAX_SIZE]; // 结点数据
int length; // 树的结点数
} SeqBinaryTree;
void preOrder(SeqBinaryTree T, int index) {
if (index >= T.length || T.data[index] == '#') {
return; // 结点不存在或为空结点,直接返回
}
printf("%c ", T.data[index]); // 输出结点数据
preOrder(T, 2 * index + 1); // 遍历左子树
preOrder(T, 2 * index + 2); // 遍历右子树
}
int main() {
SeqBinaryTree T;
int i;
// 读入二叉树的结点数据
printf("请输入二叉树的结点数据(空结点用 # 表示):\n");
for (i = 0; i < MAX_SIZE; i++) {
scanf("%c", &T.data[i]);
if (T.data[i] == '\n') {
break;
}
}
T.length = i;
// 先序遍历输出
printf("先序遍历序列为:\n");
preOrder(T, 0);
return 0;
}
```
注意:这里的二叉树顺序存储结构是完全二叉树的存储方式,因此在输入数据时需要注意输入顺序。例如,对于下面的二叉树:
```
A
/ \
B C
/ \ /
D E F
```
应该按照完全二叉树的顺序输入结点数据:`ABD##E##CF##`。
阅读全文