#include <stdio.h>
#include <malloc.h>
typedef struct ok //树结构
{
int data;
struct ok *lchild;
struct ok *rchild;
}bittree;
//队列结构
typedef struct d
{
int head; //头
int tail; //尾
bittree **data; //数组
int size; //数组长度
}Queue;
//创建树
bittree *createTree()
{
bittree *root=NULL;
int num;
scanf("%d",&num);
if(num>0)
{
root=(bittree*)malloc(sizeof(bittree));
root->data=num;
root->lchild=createTree();
root->rchild=createTree();
}
return root;
}
//初始化队列
void init(Queue *queue,int size)
{
queue->data = (bittree**)malloc(size * sizeof(bittree*)); //定义数组大小
queue->head = -1; //这里要设为-1 这又这样才能保证是从索引为0开始的
queue->tail = -1; //不然就会输不出来head=tail时候的值
queue->size = size;
for(int i = 0 ; i < size; i++)
{
queue->data[i] = NULL;
}
}
//入队
void add(Queue *queue,bittree *value)
{
if(queue->size == 0)
return ;
queue->tail = (queue->tail + 1) % queue->size; //重要算法(head +1)%size这是实现循环的关键
queue->data[queue->tail] = value;
}
//出队
bittree *out(Queue *queue)
{
queue->head = (queue->head +1) % queue->size;
bittree* value = queue->data[queue->head];
return value;
}
//判空
int isempty(Queue *queue)
{
return queue->head == queue->tail;
}
//层次遍历 类似前序遍历一 只不过它们用的结构不同 用法是相同的
void levelVisit(bittree *root)
{
Queue queue;
if(root==NULL) return ;
init(&queue,10);
add(&queue,root);
while(!isempty(&queue))
{
root=out(&queue);
printf("%5d",root->data);
if(root->lchild!=NULL) add(&queue,root->lchild);
if(root->rchild!=NULL) add(&queue,root->rchild);
}
}
int main()
{
bittree *root=createTree();
levelVisit(root);
}