基于队列的二叉树层次遍历

#include
#include
#include

#define MAXLEN 100

typedef char ElemType;
typedef char DataType;

//二叉链表存储结构
typedef struct BiTNode
{
	DataType data;
	struct BiTNode *lchild;
	struct BiTNode *rchild;
}BiTNode,*BiTree; //BiTNode为结点类型,BiTree为指向二叉链表结点的指针类型

//栈的数据类型
typedef BiTree QElemType;

//队列的顺序存储,循环队列的数据类型C语言描述

typedef struct
{
	int front;				//指向对头的位置
	int rear;				//指向对尾的下一个元素的位置
	int queueSize;			//队列的容量
	QElemType data[MAXLEN]; //存放对量数据元素的数组;
}SqQueue;

//1.初始化操作
int initSqQueue(SqQueue *LQ)
{
	LQ->front=LQ->rear=0;
	LQ->queueSize=MAXLEN;
	return 1;
}

//2.判断队空
int SqQueueEmpty(SqQueue Q)
{
	if(Q.front==Q.rear)return 1;
	else return 0;
}



//5.进队列
int SqEnQueue(SqQueue *LQ,QElemType e)
{
	if((LQ->rear+1)%LQ->queueSize==LQ->front) return 0;
	LQ->data[LQ->rear]=e;
	LQ->rear=(LQ->rear+1)%LQ->queueSize;

	printf("after Enqueue %x:front %d,rear %d\n",e,LQ->front,LQ->rear);
	return 1;
}

//6.出队列
BiTree SqDeQueue(SqQueue *LQ,QElemType *e)
{
	if(LQ->front==LQ->rear) return 0;
	*e=LQ->data[LQ->front];
	LQ->front=(LQ->front+1)%LQ->queueSize;
	printf("after Dequeue %x:front %d,rear %d\n",*e,LQ->front,LQ->rear);
}
void layer(BiTree bt)
{
	BiTree p;
	SqQueue Q;
	initSqQueue(&Q);
	if(bt) SqEnQueue(&Q,bt);
	while(!SqQueueEmpty(Q))
	{
		SqDeQueue(&Q,&p);
		printf("%c\n",p->data);
		if(p->lchild) SqEnQueue(&Q,p->lchild);
		if(p->rchild) SqEnQueue(&Q,p->rchild);
	}
}
void main()
{
	BiTree T=(BiTree)malloc(sizeof(BiTNode));
	//初始化一个二叉树,其根节点是A,没有左右孩子
	T->data='A';
	T->lchild=NULL;
	T->rchild=NULL;
//	inorder(T);
	printf("\n");

	T->lchild=(BiTree)malloc(sizeof(BiTNode));
	T->lchild->data='B';
	T->lchild->lchild=NULL;
	T->lchild->rchild=NULL;

	T->rchild=(BiTree)malloc(sizeof(BiTNode));
	T->rchild->data='C';
	T->rchild->lchild=NULL;
	T->rchild->rchild=NULL;
//	inorder(T);
	printf("\n");

	T->lchild->lchild=(BiTree)malloc(sizeof(BiTNode));
	T->lchild->lchild->data='D';
	T->lchild->lchild->lchild=NULL;
	T->lchild->lchild->rchild=(BiTree)malloc(sizeof(BiTNode));
	T->lchild->lchild->rchild->data='G';
	T->lchild->lchild->rchild->lchild=NULL;
	T->lchild->lchild->rchild->rchild=NULL;

	T->rchild->lchild=(BiTree)malloc(sizeof(BiTNode));
	T->rchild->lchild->data='E';
	T->rchild->lchild->lchild=NULL;
	T->rchild->lchild->rchild=NULL;
	T->rchild->rchild=(BiTree)malloc(sizeof(BiTNode));
	T->rchild->rchild->data='F';
	T->rchild->rchild->lchild=NULL;
	T->rchild->rchild->rchild=NULL;
	printf("层次遍历\n:");
	layer(T);

}

运行结果
基于队列的二叉树层次遍历_第1张图片

你可能感兴趣的:(数据结构)