二叉树的层次访问

来源:互联网 发布:为什么禁youtube 知乎 编辑:程序博客网 时间:2024/05/03 16:33
#include<stdio.h>#include<stdlib.h>#define OVERFLOW -1#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef 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;}//判断队空,若空,返回OKstatus 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);//出队一个元素给pprintf("%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);}

原创粉丝点击