- 实验目的
熟悉二叉树的性质、掌握二叉链表实现二叉树的存储,掌握二叉树的创建以及各种遍历算法。
二、实验内容
使用二叉链表来实现二叉树的存储,编写以下算法:
(1)二叉树的创建
(2)二叉树的前序、中序、后序、层次遍历
(3)完善main()函数的编写,调用以上算法,验证算法的正确性
#include <stdio.h>
#include <stdlib.h>
typedef struct treeNode
{
struct treeNode* lChild;//左子树
struct treeNode* rChild;//右子树
char data;
}treeNode;
typedef struct queueNode
{
treeNode* data;//队列里存放树结点
struct queueNode* prev;
struct queueNode* next;
}queueNode;
void creatTree(treeNode** root, char* data, int* index)//址传递改变值
{
char ch;//接收字符串的字符
ch = data[*index];
*index += 1;
if (ch == '#')//我们以'#'代表空
{
*root = NULL;//空结点
}
else
{
//此时不为空
*root = (treeNode*)malloc(sizeof(treeNode));
(*root)->data = ch;
//创建左子树,逻辑一致,进行递归
creatTree(&(*root)->lChild, data, index);
//创建右子树,逻辑一致,进行递归
creatTree(&(*root)->rChild, data, index);
}
}
void preOrder(treeNode* root)//先根遍历
{
if (root == NULL)
{
return;
}
else
{
printf("%c", root->data);
preOrder(root->lChild);//处理左孩子
preOrder(root->rChild);//处理右孩子
}
}
void inOrder(treeNode* root)//中根遍历
{
if (root == NULL)
{
return;
}
else
{
inOrder(root->lChild);//处理左孩子
printf("%c", root->data);
inOrder(root->rChild);//处理右孩子
}
}
void postOrder(treeNode* root)//后根遍历
{
if (root == NULL)
{
return;
}
else
{
postOrder(root->lChild);//处理左孩子
postOrder(root->rChild);//处理右孩子
printf("%c", root->data);
}
}
queueNode* initQueue()
{
queueNode* Q = (queueNode*)malloc(sizeof(queueNode));
Q->data = NULL;//哨兵位
Q->next = Q;
Q->prev = Q;
return Q;
}
void enQueue(treeNode* data, queueNode* Q)
{
if (Q == NULL)
{
return;
}
queueNode* Qnewnode = (queueNode*)malloc(sizeof(queueNode));
Qnewnode->data = data;
//找到尾结点
queueNode* tail = Q->prev;
//插入
tail->next = Qnewnode;
Qnewnode->prev = tail;
Qnewnode->next = Q;
Q->prev = Qnewnode;
}
bool isQueueEmpty(queueNode* Q)
{
return Q->next == Q;
}
queueNode* deQueue(queueNode* Q)
{
if (isQueueEmpty(Q))
{
return 0;
}
else
{
queueNode* node = Q->next;//取出即将被删除的结点
//
Q->next = node->next;
node->next->prev = Q;
return node;
}
}
void levelTraverse(queueNode* Q, treeNode* T)
{
//层次遍历
enQueue(T, Q);
while (!isQueueEmpty(Q))
{
queueNode* node = deQueue(Q);
printf("%c ", node->data->data);
if (node->data->lChild != NULL)
{
enQueue(node->data->lChild, Q);
}
if (node->data->rChild != NULL)
{
enQueue(node->data->rChild, Q);
}
}
}
void text()
{
treeNode* root;
int index = 0;//充当字符串索引
char data[30];
printf("请输入树的结点-'#'代表空>:");
gets_s(data);
creatTree(&root, data, &index);
preOrder(root);
printf("\n");
inOrder(root);
printf("\n");
postOrder(root);
printf("\n");
queueNode* Q = initQueue();
levelTraverse(Q, root);
}
int main()
{
text();
}