二叉树的层序遍历

二叉树的遍历方式有好多种,例如:前序遍历,中序遍历,后序遍历,今天学习了一个二叉树的层序遍历,下面来复习总结一下吧!

层序遍历的思想是:上一层节点出队列的时候带下一层节点进队列。

大致步骤:

1.首先创建一个队列,实现队列的初始化,尾入,头出,返回队头的数据,判断队列是否为空等节后函数。

2.定义一个结构体用来构建树,队列中存放是树的节点。

3.判断当前节点是否为空,若不为空将当前节点尾入到队列当中,然后返回队头节点的数据,再将队头的节点进行头出。

4.队头节点头出后,把被头出的节点的下一层节点尾入到队列当中。

循环步骤3和4,直到队列为空,结束循环。

下图是我自己画的层序遍历的过程图,如果有画的不对的地方请各位大佬指点!!!

 实现层序遍历的代码:

//头文件的包含
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <malloc.h>

//定义一个结构体用来创建节点
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;

//定义结构体创建树
typedef char BTDataType;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	BTDataType data;
}BTNode;



//初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;

}

//释放
void QueueDesotry(Queue* pq)
{
	assert(pq);
	while (pq->head)
	{
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
	pq->head = pq->tail = NULL;
}

//尾入
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		printf("malloc fail!\n");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->tail == NULL)
	{	
		pq->tail = pq->head = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
}

//头出
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->head);
	//1.一个节点
	//2.多个节点
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
}

//返回队头的数据
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->head);
	return pq->head->data;
}

//判断队列是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

//层序遍历,上一层出的时候带下一层节点进
void LevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	if (root == NULL)
	{
		return;
	}
	else
	{
		QueuePush(&q, root);
	}
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		printf("%c ", front->data);
		QueuePop(&q);
		 
		if (front->left)
		{
			QueuePush(&q, front->left);

		}
		if (front->right)
		{
			QueuePush(&q, front->right);
		}
	}
	printf("\n");
	QueueDesotry(&q);
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值