c语言 数据结构二叉树 层次遍历 简单上手代码

                                                       二叉树——层次遍历

目录

1.定义变量

2.创建一棵树

3.初始化队

4.入队操作

5.判断队列是否为空函数

6.出队操作

7.层次循环遍历,打印结果

7.先序遍历,对比结果

8.主函数调用

9.结果展示


首先,想如何层次的遍历一个二叉树呢?简单思路分为如下几步:

1.要先创建一个二叉树。(二叉树建立可参考上一篇博客)

2.采用队列思想,先进先出。也就是说先要创建一个队列。

3.首先根入队,然后出队,再入队它的左右孩子,然后左孩子出队,再入队左孩子的左右孩子,再出队右孩子,加入右孩子没有左右孩子为空,就什么就不用干,继续出队左孩子的左右孩子,直到所有元素都出完队时,遍历也就结束了。

代码:

1.定义变量

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct TreeNode
{
	int data;
	struct TreeNode* lchild;
	struct TreeNode* rchild;
}TreeNode;              //定义树
typedef struct QueueNode
{
	TreeNode* node;
	struct QueueNode* pre;
	struct QueueNode* next;
};                    // 定义队

2.创建一棵树

不再详细解释,如果不会看上一篇博客二叉树代码实现。

void creatTree(TreeNode** t,int* index,char* data)
{
char ch;
ch = data[*index];
(*index)++;
if (ch == '#')
*t = NULL;
else
{
*t = (TreeNode*)malloc(sizeof(TreeNode));
assert(*t);
(*t)->data = ch;
creatTree(&((*t)->lchild), index, data);
creatTree(&((*t)->rchild), index, data);
}
}

3.初始化队

QueueNode* initQueue()
{
QueueNode* Q = (QueueNode*)malloc(sizeof(QueueNode));
assert(Q);
Q->node = NULL;
Q->next =Q;
Q->pre = Q;
return Q;
}
//采用循环双链表队列模式,其它链表也可

4.入队操作

void enQueue(QueueNode* Q,TreeNode* data)
{
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
    assert(newnode);
	newnode->node = data;
	newnode->pre= Q;
	newnode->next = Q;
	Q->pre->next = newnode;
	Q->pre = newnode;
}

5.判断队列是否为空函数

int is_emepty(QueueNode* Q)
{
	if (Q->next == NULL)
		return 0;
	else
		return 1;
}

6.出队操作

QueueNode* deQueue(QueueNode* Q)
{
	if (is_emepty(Q) == 0)
		return NULL;
	else
	{
		QueueNode* node = Q->next;
		Q->next->next->pre = Q;
		Q->next = Q->next->next;
		return node;
	}
}

7.层次循环遍历,打印结果

void levelTraverse(QueueNode* Q, TreeNode* T)
{
	enQueue(Q, T);   
	while (is_emepty(Q))
	{
		QueueNode* node = deQueue(Q);
		printf("%c ", node->node->data);
		if (node->node->lchild)
			enQueue(Q, node->node->lchild);
		if (node->node->rchild)
			enQueue(Q, node->node->rchild);
	}
}

7.先序遍历,对比结果

void preOrder(TreeNode* t)
{
	if (t == NULL)
		return;
	else
	{
		printf("%c", t->data);
		preOrder(t->lchild);
		preOrder(t->rchild);
	}
}

8.主函数调用

int main()
{
	TreeNode* t;
	char data[100];
	int index = 0;
	gets_s(data);
	creatTree(&t, &index, data);
	preOrder(t);
	printf("\n");
	QueueNode* q = initQueue();
	levelTraverse(q, t);
	return 0;
}

9.结果展示

ab##c##
abc
a b c
D:\VS\test.2\树\Debug\树.exe (进程 7660)已退出,代码为 -1073741819。
按任意键关闭此窗口. . .
adc#d####
adcd
a d c d
D:\VS\test.2\树\Debug\树.exe (进程 12196)已退出,代码为 -1073741819。
按任意键关闭此窗口. . .

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

洁洁!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值