C语言二叉树的层序遍历

上一篇中我记录了二叉树的先序,中序,后序的递归和非递归遍历方法,这一篇会接着上一篇的,记录二叉树的层序遍历方法,层序遍历用到了队列的数据结构,下面直接上代码:

1、首先是链队列的数据结构定义,LinkQueue.h文件:

#pragma once
#include "BinaryTree.h"

/** 链队列的节点定义,包含一个数据域和下一个节点的指针 */
typedef struct QueueNode {
	BiTreeNode* data;
	struct QueueNode* next;
}QueueNode;

/**  链队列的定义,包含队头和队尾指针*/
typedef struct {
	QueueNode* front;
	QueueNode* rear;
}LinkQueue;

LinkQueue* InitQueue();/** 链队列的初始化 */
void DestoryQueue(LinkQueue*);/** 销毁队列 */
void EnQueue(LinkQueue*, BiTreeNode*);/** 入队 */
BiTreeNode* DeQueue(LinkQueue*);/** 出队 */

2、LinkQueue.c文件:

#include <stdio.h>
#include <stdlib.h>
#include "LinkQueue.h"

/** 链队列的初始化 */
LinkQueue* InitQueue()
{
	LinkQueue* queue = (LinkQueue*)malloc(sizeof(LinkQueue));
	if (!queue)
	{
		printf("init queue error!\n");
		exit(0);
	}
	queue->front = (QueueNode*)malloc(sizeof(QueueNode));
	queue->front->next = NULL;
	queue->rear = queue->front;
	return queue;
}

/** 链队列的销毁,注意先进去的是队列头,后进去的是队列尾 */
void DestoryQueue(LinkQueue* queue)
{
	while (queue->front)
	{
		queue->rear = queue->front->next;
		free(queue->front);
		queue->front = queue->rear;
	}
}

/** 入队 */
void EnQueue(LinkQueue* queue, BiTreeNode* node)
{
	QueueNode* queueNode = (QueueNode*)malloc(sizeof(QueueNode));
	queueNode->data = node;
	queueNode->next = NULL;
	queue->rear->next = queueNode;
	queue->rear = queueNode;
}

/** 出队 */
BiTreeNode* DeQueue(LinkQueue* queue)
{
	if (queue->front == queue->rear)//队列为空
		return NULL;
	QueueNode* p = queue->front->next;
	BiTreeNode* node = p->data;
	queue->front = p;
	return node;
}

3、测试代码

#include<stdio.h>
#include <stdlib.h>
#include "Stack.h"

void printResult(char *msg, void(*p)(BiTreeNode*), BiTreeNode* node)
{
	printf("\n---------%s---------\n", msg);
	p(node);
	printf("\n---------%s---------\n", msg);
}

int main()
{
	printf("使用先序创建二叉树,#表示空节点,请输入二叉树的数据:\n");
	BiTreeNode* root = CreateBinaryTree();

	printResult("层序遍历", LayerOrderBiTree, root);

	return 0;
}


测试用的二叉树如下图:

C语言二叉树的层序遍历_第1张图片

代码运行结果如下图:

C语言二叉树的层序遍历_第2张图片

下面记录遇到的坑:

在实现队列的出队操作时,代码如下:


开始我的代码写错了,第46行写成了QueueNode* p = queue->front,结果运行报错,单步跟踪后发现出队不正确,后来检查原来46行代码不对,原因是初始化队列时,给对头分配了内存空间,然后对头跟队尾都指向该空间,但是入队的时候该空间是没有用到的,就相当于建立单链表时带了一个头结点,如下图所示:

C语言二叉树的层序遍历_第3张图片

所以出队的时候,队头节点应该是queue->front->next,而不是queue->front!!!

你可能感兴趣的:(二叉树,C语言,层序遍历)