实验4---二叉树的实现和遍历

  • 实验目的

熟悉二叉树的性质、掌握二叉链表实现二叉树的存储,掌握二叉树的创建以及各种遍历算法。

二、实验内容

使用二叉链表来实现二叉树的存储,编写以下算法:

(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();
}

实验结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1YC..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值