层次遍历二叉树实验1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdio.h"
#include "malloc.h"
#define OK 1
#define ERROR 0
#define NULL 0
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
typedef struct QNode{
BiTree data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int CreateBiTree(BiTree &T){
char ch,c;
scanf("%c",&ch);
if(ch==' ')
T=NULL;
else{
if(!(T=(BiTree)malloc(sizeof(BiNode))))
return(ERROR);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return(OK);
}
int InitQueue(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front){
printf("队列内存分配失败\n");
return(ERROR);
}
else
Q.front->next=NULL;
return(OK);
}
int EmptyQueue(LinkQueue &Q){
if(Q.front->next==NULL)
return(OK);
else
return(ERROR);
}
void EnQueue(LinkQueue &Q,BiTree p){
QueuePtr s;
s=(QueuePtr)malloc(sizeof(QNode));
s->data=p;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
int DeQueue(LinkQueue &Q,BiTree &p){//zhongyao
QueuePtr s;
if(Q.front==Q.rear){
printf("队列已空,不能进行出队操作\n");
return(ERROR);
}
s=Q.front->next;
p=s->data;
printf("%c",p->data);
Q.front->next=s->next;
if(Q.rear==s)
Q.rear=Q.front;
free(s);
return(OK);
}
int levelOrder(BiTree &T){
BiTree p;
LinkQueue Q;
InitQueue(Q);
p=T;
if(!T){
printf("树为空树\n");
return(ERROR);
}
EnQueue(Q,p);
while(!EmptyQueue(Q)){
DeQueue(Q,p);
if(p->lchild!=NULL){
EnQueue(Q,p->lchild);
}
if(p->rchild!=NULL){
EnQueue(
Q,p->rchild);
}
}
return(OK);
}
void main(){
BiTree T;
CreateBiTree(T);
printf("按层次遍历二叉树各节点后的结果\n");
levelOrder(T);
printf("\n");
}