用顺序存储结构来存储一颗具有n个结点的二叉树,用c语言编写算法实现对该二叉树进行先序遍历,输出先序遍历序列。
时间: 2023-06-16 15:02:18 浏览: 102
各种二叉树的数据结构.rar_二叉树_二叉树 遍历_实现二叉树的先、中、后序递归遍历算_数据结构_数据结构 算法
假设二叉树的结点结构体定义如下:
```c
typedef struct TreeNode {
char data; // 结点存储的数据
struct TreeNode* left; // 左子结点指针
struct TreeNode* right; // 右子结点指针
} TreeNode;
```
则使用顺序存储结构来存储该二叉树的数组定义如下:
```c
TreeNode* tree[MAX_SIZE]; // MAX_SIZE为数组的最大容量
```
其中数组下标为i的元素表示二叉树中第i个结点的指针,如果二叉树中只有n个结点,则数组中前n个元素是有效的,后面的元素可以不用管。
先序遍历的递归算法如下:
```c
void preOrder(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%c ", root->data); // 输出当前结点的值
preOrder(root->left); // 递归遍历左子树
preOrder(root->right); // 递归遍历右子树
}
```
使用数组表示二叉树,只需要将root结点的下标设为0,左子结点的下标为2*i+1,右子结点的下标为2*i+2,则先序遍历的非递归算法如下:
```c
void preOrder(TreeNode* root) {
if (root == NULL) {
return;
}
int stack[MAX_SIZE]; // 定义一个栈
int top = -1; // 栈顶指针
stack[++top] = 0; // 将root结点的下标入栈
while (top >= 0) {
int i = stack[top--]; // 弹出栈顶元素
printf("%c ", tree[i]->data); // 输出当前结点的值
// 将右子结点的下标入栈,注意要先入栈右子结点
if (tree[i]->right != NULL) {
stack[++top] = 2*i+2;
}
// 将左子结点的下标入栈
if (tree[i]->left != NULL) {
stack[++top] = 2*i+1;
}
}
}
```
阅读全文