C语言数据结构代码练习day18
二叉树层序遍历
图示:
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct BiNode{
int data; //二叉树存储数据
struct BiNode *lchild, *rchild; //左孩子指针和右孩子指针
}BiNode,*BiTree; //二叉树结点、二叉树指针
/***************层序遍历***************/
typedef struct LNode{ //定义栈数据结构
BiNode *data; //存储二叉树指针
struct LNode *Next; //链指针
}LNode;
typedef struct{ //定义队列
LNode *front,*rear; //队头指针、队尾指针
}LinkQueue;
/*带头结点的队列初始化*/
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LNode *)malloc(sizeof(LNode));
Q.front->Next=NULL; //队空
}
/*带头结点入队*/
void EnQueue(LinkQueue &Q,BiTree x){
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->Next=NULL;
Q.rear->Next=s;
Q.rear=s;
}
/*出队*/
void DeQueue(LinkQueue &Q,BiTree &x){
if(Q.front==Q.rear)
printf("Error"); //队空
LNode*p=Q.front->Next;
x=p->data;
printf("%d",x->data); //出队,二叉树结点内容输出
Q.front->Next=p->Next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
}
bool empty(LinkQueue Q){
if(Q.front==Q.rear)
return false; //队空
else
return true; //队列不空
}
/*层序遍历*/
void LevelOrder(BiTree T){
LinkQueue Q;
InitQueue(Q); //初始化队列
EnQueue(Q,T); //根结点入队
BiTree p; //临时二叉树结点
while(empty(Q)!=false)
{
DeQueue(Q,p); //出队
if(p->lchild!=NULL)
EnQueue(Q,p->lchild); //当前结点左孩子入队
if(p->rchild!=NULL)
EnQueue(Q,p->rchild); //当前结点右孩子入队
}
}