#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);
}
二叉树的层次访问
最新推荐文章于 2020-09-11 09:35:19 发布