二叉树的层次访问

#include<stdio.h>
#include<stdlib.h>

#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int status;
typedef char TElemType;
typedef struct TNode{
	TElemType data;
	struct TNode *lchild,*rchild;
}BNode,*BTree;
typedef BTree QElemType; //队列元素类型,即二叉树根指针类型

typedef struct QNode{//队列结点类型
	QElemType data;
	struct QNode *next;
}QNode,*QLink;
typedef struct{//队列类型
	QLink front,rear;
}Queue;

/*      队列的基本操作     */
//初始化一个空队列
status InitQueue(Queue &Q)
{
	Q.front=Q.rear=(QLink)malloc(sizeof(QNode));
	if(!Q.front) exit(OVERFLOW);
	Q.front->next=NULL;
	return OK;
}

//元素e入队
void InQueue(Queue &Q,QElemType e)
{
	QLink s;
	s=(QLink)malloc(sizeof(QNode));
	if(!s) exit(OVERFLOW);
	s->data=e;
	s->next=NULL;
	Q.rear->next=s;
	Q.rear=s;
}

//出队,用e返回值
status OutQueue(Queue &Q,QElemType &e)
{
	QLink p;
	if(Q.front==Q.rear) return ERROR;
	p=Q.front->next;
	e=p->data;
	Q.front->next=p->next;
	if(p==Q.rear) Q.rear=Q.front;
	free(p);
	return OK;
}

//判断队空,若空,返回OK
status EmptyQueue(Queue Q)
{
	if(Q.front==Q.rear) return TRUE;
	else return FALSE;
}

//创建二叉树	 
status creat(BTree &t) 
{
	char ch;
	ch=getchar();
	if(ch==' ') t=NULL;
	else{
		t=(BTree)malloc(sizeof(BNode));
		if(!t) exit(OVERFLOW);
		t->data=ch;
		creat(t->lchild);
		creat(t->rchild);
	}
	return OK;
}

//先序访问
void DLR(BTree t)
{
	if(t){
		printf("%c",t->data);
		DLR(t->lchild);
		DLR(t->rchild);
	}
}

//层次访问
void Level(BTree t)
{   //层次遍历
	BTree p;
	Queue Q;
	InitQueue(Q);//初始化一个队列
	p=t;//p指向树根
	if(!p) return;//空树,返回
	InQueue(Q,p) ;//非空根指针入队
	while(!EmptyQueue(Q))//当队列不空时
	{
		OutQueue(Q,p);//出队一个元素给p
		printf("%c",p->data);//输出值
		if(p->lchild) InQueue(Q,p->lchild);//若有左孩子,左孩子入队
		if(p->rchild) InQueue(Q,p->rchild);//若有有孩子,右孩子入队
	}
}


void main()
{
	BTree t=NULL;
    printf("创建二叉树,空格代表空树\n");
	creat(t);
	printf("建立成功\n");
	printf("先序遍历的结果为:\n");
	DLR(t);
	printf("\n层次遍历的结果为:");
	Level(t);
}


原文地址:https://www.cnblogs.com/javawebsoa/p/3089290.html