版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwx19921215/article/details/83306952
首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图:
顺序遍历的结果为:ABCDEFGHIJK
我们可以借助一个队列来实现二叉树的层次遍历;思路如下:
先将二叉树根节点入队,然后出队,访问该节点,如果有左子树,则将左子树根节点入队;如果有右子树,则将右子树根节点入队。然后出队,对出队节点访问,如此循环
直到队列为空。
代码实现:
//
// Created by Administrator on 2018/6/5.
//
/**
* 层次遍历:通过辅助队列实现二叉树的层次遍历
*/
#include "stdio.h"
#include "stdlib.h"
/**
* 定义一棵树
*/
typedef struct {
char data;
struct BitTreeNode *lchild, *rchild;
} BitTreeNode, *BitTree;
/**
* 定义一个队列节点
*/
typedef struct {
BitTree data;//节点元素
struct QNode *next;//节点指向下一个节点的指针域
} QNode;
/**
* 定义一个队列:链式队列
*/
typedef struct {
//队列的头指针,尾指针:头指针始终指向头节点,尾指针随着元素入队向后移动
// 如果队列为空则头指针=尾指针同时指向头节点
QNode *front, *rear;
} LinkQueue;
/**
* 前序法创建树
* @param tree
* @return
*/
BitTree createTree(BitTree tree) {
char c;
scanf("%c", &c);
if (c == '#') {
return 0;
} else {
tree = (BitTree) malloc(sizeof(BitTreeNode));
tree->data = c;
tree->lchild = createTree(tree->lchild);
tree->rchild = createTree(tree->rchild);
}
return tree;
}
/**
* 初始化队列
* @param q
*/
void initQueue(LinkQueue *q) {
q->front = q->rear = (QNode *) malloc(sizeof(QNode));
q->front->next = NULL;
}
/**
* 入队操作
* @param q
* @param tree
*/
void enQueue(LinkQueue *q, BitTree tree) {
//开辟节点空间
QNode *s = (QNode *) malloc(sizeof(QNode));
//节点数据域赋值
s->data = tree;
//队列尾指针的指针域指向该节点
q->rear->next = s;
//队列尾指针移动到该节点
q->rear = s;
}
/**
* 出队操作
* @param q
* @return
*/
BitTree deQueue(LinkQueue *q) {
//获取头结点的下一个节点
QNode *s = q->front->next;
//获取数据元素
BitTree tree = s->data;
//队列头指针的指针域指向出队节点的下一个节点
q->front->next = s->next;
if (s == q->rear) {
//如果出队节点为队列尾指针,则说明该节点为队列的最后一个元素节点
//将尾指针指向头指针(头指针指向了头结点)
q->rear = q->front;
}
free(s);
return tree;
}
void visit(char data) {
printf("%c", data);
}
/**
* 二叉树层次遍历
* @param tree
* @param queue
*/
void levelOrder(BitTree tree, LinkQueue queue) {
initQueue(&queue);
BitTree p;
enQueue(&queue, tree);
while (queue.front != queue.rear) {
p = deQueue(&queue);
visit(p->data);
if (p->lchild != NULL) {
enQueue(&queue, p->lchild);
}
if (p->rchild != NULL) {
enQueue(&queue, p->rchild);
}
}
}
int main() {
LinkQueue queue;
BitTree tree;
tree = createTree(tree);
printf("层次遍历结果:\n");
levelOrder(tree, queue);
return 0;
}