在上一篇中我记录了二叉树的先序,中序,后序的递归和非递归遍历方法,这一篇会接着上一篇的,记录二叉树的层序遍历方法,层序遍历用到了队列的数据结构,下面直接上代码:
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*);/** 出队 */
#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; }
#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; }
代码运行结果如下图:
下面记录遇到的坑:
在实现队列的出队操作时,代码如下:
开始我的代码写错了,第46行写成了QueueNode* p = queue->front,结果运行报错,单步跟踪后发现出队不正确,后来检查原来46行代码不对,原因是初始化队列时,给对头分配了内存空间,然后对头跟队尾都指向该空间,但是入队的时候该空间是没有用到的,就相当于建立单链表时带了一个头结点,如下图所示:
所以出队的时候,队头节点应该是queue->front->next,而不是queue->front!!!