二叉树的遍历方式有好多种,例如:前序遍历,中序遍历,后序遍历,今天学习了一个二叉树的层序遍历,下面来复习总结一下吧!
层序遍历的思想是:上一层节点出队列的时候带下一层节点进队列。
大致步骤:
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);
}