#include #include
/**
* 二叉树二叉链表之非递归遍历:层序遍历
* 算法思想:借助一个队列;根树进队;队不为空时循环“从队列中出一个树p,访问该树根结点;
* 若它有左子树,左子树进队;若它有右子树,右子树进队。”
* (保证了元素进队顺序是从树的上层到下层,且同层元素在队列中从左到右相邻)
* (注:为了节约空间,这里的树进队,是指树的地址进队,而不是树结点进队,队列中存放的是对各树地址的引用)*/
#define OK 1;
#define TURE 1;
#define FALSE 0;
#define ERROR 0;
const int OVERFLOW = -2;const int MAXSIZE = 100;
typedefintStatus;
typedefcharTElemType;//二叉链表结构定义
typedef structBiNode{
TElemType data;struct BiNode *lchild, *rchild;
} BiNode,*BiTree;//顺序循环队列定义
typedef struct{
BiTree*base; //存放树型指针
int front; //头指针,若队列不为空,指向队列头元素
int rear; //尾指针,若队列不为空,指向队列尾元素的下一个位置
} SqQueue;//由字符序列创建二叉树
Status CreateBiTree(BiTree *tree,TElemType data[],int *j,intlen){if((*j)<=len-1){if(data[(*j)]==‘#‘){
(*tree)=NULL;
(*j)++;
}else{
(*tree)=(BiTree)malloc(sizeof(BiNode));if(!(*tree)) returnOVERFLOW;
(*tree)->data=data[(*j)]; //生成根结点
(*j)++;
CreateBiTree(&((*tree)->lchild),data,j,len); //构造左子树
CreateBiTree(&((*tree)->rchild),data,j,len); //构造右子树
}
}returnOK;
}//访问二叉树结点
Status Visit(BiTree tree){
printf("%c",tree->data);returnOK;
}//借助队列实现二叉链表的层序遍历
Status LevelOrder_ByQueue(BiTree tree) {
BiTree p;
SqQueue queue1;
InitQueue(&queue1);
EnQueue(&queue1,tree); //根结点入队
while(queue1.front!=queue1.rear){ //队不为空
DeQueue(&queue1,&p); //根节点出队
Visit(p);if(p->lchild!=NULL) EnQueue(&queue1,p->lchild); //有左孩子就进队
if(p->rchild!=NULL) EnQueue(&queue1,p->rchild); //有右孩子也进队
}returnOK;
}/***用到队列的相关函数***/
//循环队列初始化
Status InitQueue(SqQueue *queue) {
queue->base=(BiTree*)malloc(sizeof(BiTree)*MAXSIZE); //分配队列数组空间
if(!queue->base) return OVERFLOW; //分配失败
queue->front=0;
queue->rear=0;returnOK;
}//循环队列入队操作
Status EnQueue(SqQueue *queue,BiTree elem){if((queue->rear+1)%MAXSIZE==queue->front){ //队满
returnERROR;
}else{
queue->base[queue->rear]=elem;
queue->rear=(queue->rear+1)%MAXSIZE;returnOK;
}
}//循环队列出队操作
Status DeQueue(SqQueue *queue,BiTree *elem){if(queue->front==queue->rear){ //队空
returnERROR;
}else{
(*elem)=queue->base[queue->front];
queue->front=(queue->front+1)%MAXSIZE;returnOK;
}
}int main(void){//示例二叉树的结构
/*A
/
B
/ C D
/ E F
G*/
//指向二叉树的指针
BiTree bitree1;//创建二叉树 待用数据
TElemType data1[]={‘A‘,‘B‘,‘C‘,‘#‘,‘#‘,‘D‘,‘E‘,‘#‘,‘G‘,‘#‘,‘#‘,‘F‘,‘#‘,‘#‘,‘#‘,}; //先序遍历序列
int len1=sizeof(data1)/sizeof(data1[0]);int* j1=(int*)malloc(sizeof(int));*j1=0;//按先序遍历序列创建二叉树
Status createBiTreeResult = CreateBiTree(&bitree1,data1,j1,len1);
printf("二叉树创建结果:%d\n",createBiTreeResult);//层序遍历二叉树
Status levelOrder_ByQueue = LevelOrder_ByQueue(bitree1); //注:这里参数是二叉树根结点,而不是指针
printf("\n层序遍历二叉树结果:%d\n",levelOrder_ByQueue);
printf("\nEND");return 0;
}