二叉树的层次访问

#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);

}

二叉树的层次访问

你可能感兴趣的:(二叉树)