#include<iostream>
#define MaxSize 50
using namespace std;
typedef int ElementType;
typedef struct BiTNode {
ElementType data;
struct BiTNode* lchild,*rchild;
}BinTNode,*BinTree;
typedef struct {
BinTree Data[MaxSize];
int front, rear;
}Queue;
void InitQueue(Queue &Q)
{
Q.front = Q.rear = 0;
}
bool IsEmpty(Queue& Q)
{
if (Q.rear == Q.front)
{
return true;
}
else
{
return false;
}
}
void EnQueue(Queue& Q, BinTree T)
{
Q.Data[Q.rear] = T;
Q.rear = (Q.rear + 1) % MaxSize;
}
bool DeQueue(Queue &Q,BinTree &p)
{
if (IsEmpty(Q))
{
return false;
}
else
{
printf("%d\n",Q.Data[Q.front]->data);
p = Q.Data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return true;
}
}
//这里我将采取最简单的建立方式,由多少个节点就先申请多少个空间
BinTree create_BinTree()
{
BinTree node1 = (BinTree)malloc(sizeof(BinTNode));
node1->data = 1; //我们为node1申请了空间,并对它的data赋值了
BinTree node2 = (BinTree)malloc(sizeof(BinTNode));
node2->data = 2; //我们为node2申请了空间,并对它的data赋值了
BinTree node3 = (BinTree)malloc(sizeof(BinTNode));
node3->data = 3; //我们为node3申请了空间,并对它的data赋值了
BinTree node4 = (BinTree)malloc(sizeof(BinTNode));
node4->data = 4; //我们为node4申请了空间,并对它的data赋值了
BinTree node5 = (BinTree)malloc(sizeof(BinTNode));
node5->data = 5; //我们为node5申请了空间,并对它的data赋值了
BinTree node6 = (BinTree)malloc(sizeof(BinTNode));
node6->data = 6; //我们为node6申请了空间,并对它的data赋值了
//以上我们申请了6个节点并对其赋予了图对应的值,接下来看看这六个节点的关系,并为了安全防止程序乱输出,要将没有左右孩子的节点的对应指针赋为NULL;
//由图观察node1,左孩子为node2,右孩子为node3
node1->lchild = node2;
node1->rchild = node3;
//由图观察node2,没有左孩子,赋为NULL,右孩子为node4
node2->lchild = NULL;
node2->rchild = node4;
//由图观察node3,没有左孩子,赋为NULL,右孩子为node5
node3->lchild = NULL;
node3->rchild = node5;
//由图观察node4,左孩子为node6,无右孩子,赋为NLLL;
node4->lchild = node6;
node4->rchild = NULL;
//由图观察node5,既没有左孩子又没有右孩子,赋为NULL
node5->lchild = NULL;
node5->rchild = NULL;
//由图观察node6,既没有左孩子又没有右孩子,赋为NULL
node6->lchild = NULL;
node6->rchild = NULL;
return node1; //这里返回node1的原因是,它是这幅图的根节点
}
void LevelOrder(BinTree Tree)
{
Queue Q;
BinTree p=(BinTree)malloc(sizeof(BinTNode));
InitQueue(Q);
EnQueue(Q, Tree);
while (!IsEmpty(Q))
{
DeQueue(Q,p);
if (p->lchild != NULL)
{
EnQueue(Q,p->lchild);
}
if (p->rchild != NULL)
{
EnQueue(Q, p->rchild);
}
}
}
int main()
{
BinTree root = (BinTree)malloc(6*sizeof(BinTNode)); //这里乘以6是因为我的二叉树总共有6个节点,所以对于根节点要申请6个同样大小空间的节点或者更大,反正要大于二叉树所有节点的个数
root = create_BinTree(); //调用函数创建该二叉树
LevelOrder(root);
}
层序遍历的思想是,先把根节点放进队列中,然后如果队列不为空,则一直观察出队列的节点的左右孩子是否为空,先放左孩子再放右孩子。写成一个循环即可。我这里建队列省略了一些操作,因为我单纯针对这仅有6个节点的二叉树设立的。
结果如下: