我的主力博客:半亩方塘
层序遍历二叉树需要用到队列的先进先出的特性,这里的二叉树采用二叉链接表示法,队列是采用顺序存储结构的循环队列,按照前序遍历建立二叉树,利用队列层序遍历二叉树的主要过程如下:
- 将二叉树的根结点的指针入队列
- 若队列非空,将队列中的队头元素出队列,然后将该队头元素的左孩子指针(若存在)入队列,接着将队头元素的右孩子指针(若存在)入队列
- 重复过程2,直到队列中没有元素为止
具体代码实现过程如下:
/**
* 用队列作为辅助手段层序遍历二叉树
* author: 王小平
* date: 2015/12/04
*/
#include <stdio.h>
#include <stdlib.h>
/* 二叉链表表示的二叉树 */
typedef char TElemType;
typedef struct BiTNode /* 结点结构 */
{
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
/* 前序遍历建立二叉树 */
void PreCreateBiTree(BiTree *T)
{
TElemType ch;
scanf("%c", &ch);
if('#' == ch)
*T = NULL;
else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
PreCreateBiTree(&((*T)->lchild));
PreCreateBiTree(&((*T)->rchild));
}
}
/* 顺序循环队列 */
#define MAXSIZE 100
typedef BiTree QElemType;
typedef struct
{
QElemType data[MAXSIZE];
int front, rear; // 分别存放队头和队尾的位置
} SqQueue, *SqQueuePtr;
/* 初始化队列 */
void InitQueue(SqQueuePtr Q)
{
Q->front = 0;
Q->rear = 0;
}
/* 判断队列空 */
int QEmpty(SqQueuePtr Q)
{
return (Q->front == Q->rear);
}
/* 判断队列满 */
int QFull(SqQueuePtr Q)
{
return ((Q->rear + 1) % MAXSIZE == Q->front);
}
/* 从队尾入队列 */
typedef int Status;
#define OK 1
#define ERROR 0
Status EnQueue(SqQueuePtr Q, QElemType e)
{
if(QFull(Q)) /* 队列满则返回错误 */
return ERROR;
Q->data[Q->rear++] = e;
return OK;
}
/* 从队头出队列 */
Status DeQueue(SqQueuePtr Q, QElemType *e)
{
if(QEmpty(Q))
return ERROR; /* 队列空则返回错误 */
*e = Q->data[Q->front++];
return OK;
}
/* 层序遍历二叉树 */
void LevelTraverse(BiTree T)
{
SqQueuePtr queue;
queue = (SqQueuePtr)malloc(sizeof(SqQueue));
InitQueue(queue);
/* 1、将二叉树的根结点入队列
* 2、将队头元素出队列
* 3、并将队头元素的左子树的根结点(非空)右子树的根结点(非空)分别入队列
* 4、重复2、3,直至队列中没有元素
*/
EnQueue(queue, T);
QElemType tmp;
while(!QEmpty(queue)) {
DeQueue(queue, &tmp);
printf("%3c", tmp->data);
if(tmp->lchild)
EnQueue(queue, tmp->lchild);
if(tmp->rchild)
EnQueue(queue, tmp->rchild);
}
printf("\n");
}
int main()
{
BiTree tree;
printf("Please input a binary tree:\n");
PreCreateBiTree(&tree);
printf("The result of level traverse:\n");
LevelTraverse(tree);
return 0;
}
有关源代码以及运行截图请移步至我的github