二叉树的层序遍历
这是库存,以前写的。
一、思想
要进行二叉树的层序遍历,需要借助一个辅助队列实现。首先将二叉树的根结点入队,然后出队,访问出队结点,若它有左子树,则将左子树根结点入队;若它有右子树,将右子树根结点入队。然后出队,访问出队结点…如此反复,直到队列为空。(参考王道书)
二、代码实现
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef struct BNode {
int data; //数据域
struct BNode* lchild; //左孩子
struct BNode* rchild; //右孩子
}*BiTree,BNode;
//循环队列的数据结构
typedef struct CirSqueue
{
BiTree data[MaxSize]; //队列最大容量为MaxSize
int front,rear;
}CirSqueue;
//初始化
void Initqueue(CirSqueue *Q)
{
Q->front = Q->rear = 0;
}
//判断队列是否为空
int QueueEmpty(CirSqueue Q)
{
return Q.front == Q.rear;
}
//入队
void EnQueue(CirSqueue *Q, int x)
{
if ((Q->rear + 1) % MaxSize == Q->front)
{
printf("队满!\n");
return;
}
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MaxSize;
}
//出队
void OutQueue(CirSqueue *Q)
{
Q->front = (Q->front + 1) % MaxSize;
}
BiTree CreateBinTree()
{
int data;
int temp;
BiTree T;
scanf("%d", &data); // 输入数据
temp = getchar(); //吸收空格
if (data == -1) { //输入-1 代表此节点下子树不存数据,也就是不继续递归创建
return NULL;
}
else {
T = (BiTree)malloc(sizeof(BNode)); // 分配内存空间
T->data = data; // 把当前输入的数据存入当前节点指针的数据域中
printf("请输入%d的左子树: ", data);
T->lchild = CreateBinTree(); // 开始递归创建左子树
printf("请输入%d的右子树: ", data);
T->rchild = CreateBinTree(); // 开始到上一级节点的右边递归创建左右子树
return T; // 返回根节点
}
}
//层序遍历需要借助队列来实现
void levelOrder(BiTree T)
{
CirSqueue Q;
Initqueue(&Q);
EnQueue(&Q,T);//根节点入队
BiTree P;
while (!QueueEmpty(Q))
{
printf("%d ",Q.data[Q.front]->data);//访问队头元素
P = Q.data[Q.front];
OutQueue(&Q);//出队
if(P->lchild!=NULL)
EnQueue(&Q, P->lchild);//左子树不空则入队
if(P->rchild!=NULL)
EnQueue(&Q, P->rchild);//右子树不空则入队
}
}
int main()
{
BiTree T;
printf("请输入第一个节点的数据:\n");
T = CreateBinTree(); // 接受创建二叉树完成的根节点
printf("\n层次遍历结果: \n");
levelOrder(T);
return 0;
}
三、测试结果
注意,保存代码时要以 .c 为后缀,而不是.cpp后缀。