按层次遍历算法
按层次遍历就是按二叉树层次从上而下,从左到右顺序访问其各结点
算法思想:
建立一循环队列,队列元素为指针类型变量,此循环队列用来暂存二叉树结点的指针。
在遍历二叉树之前,先将此树的根节点指针送入循环队列,开始层次遍历时再将此根节点指针出队来访问根节点,然后判断其左或右儿子是否存在,若存在,则将左右儿子结点的指针依次送入队列。左儿子指针先于右儿子指针入队。
#include<malloc.h>
#include<stdio.h>
#define QUEUESIZE 20 /*定义循环队列最大容量为20*/
typedef struct node{
int data1;
struct node *lchild;
struct node *rchild;
}BINTNODE,*BINTREE; /*定义二叉链表指针类型*/
typedef struct cirqueue{/*循环队列的存储结构定义*/
int front,rear;/*定义队列头 尾指针*/
BINTNODE *data[QUEUESIZE];
}CIRQUEUE;
void createbintree(BINTREE *t){/*输入二叉树的先嘘遍历序列,创建二叉链表*/
int a;
scanf("%d",&a);
if(a==0)
*t=NULL;
else{
*t = (BINTNODE *)malloc(sizeof(BINTNODE));/*申请结点*t的结点空间*/
(*t)->data1 = a;/*将结点数据a放入根结点的数据域*/
createbintree(&(*t)->lchild);/*建立左子树*/
createbintree(&(*t)->rchild);/*建立左子树*/
}
}
leverorder(BINTREE t){/*层次遍历二叉树*/
CIRQUEUE *q;
BINTREE p;
q = (CIRQUEUE *)malloc(sizeof(CIRQUEUE));/*申请循环队列空间*/
q ->rear = q->front = 0;/*将循环队列初始化为空*/
q ->data[q->rear] = t;/*将跟结点指针入队*/
q ->rear = (q->rear+1)%QUEUESIZE;/*将队列尾指针加1*/
while(q->rear != q->front){
p = q->data[q->front];/*取队首元素*p*/
printf("%d",p->data1);/*打印*p结点的数据域信息*/
q ->front = (q->front+1)%QUEUESIZE;/*将队列尾指针加1*/
if((q->rear+1)%QUEUESIZE ==q->front)/*队列为满*/
printf("the queue is full");
else{
if(p->lchild!=NULL){//左孩子不为空
q->data[q->rear] = p->lchild;
q->rear = (q->rear+1)%QUEUESIZE;/*修改队列尾指针*/
}
}
if((q->rear+1)%QUEUESIZE ==q->front)/*队列为满*/
printf("the queue is full");
else{
if(p->lchild!=NULL){//右孩子不为空
q->data[q->rear] = p->rchild;
q->rear = (q->rear+1)%QUEUESIZE;/*修改队列尾指针*/
}
}
}
}
main(){
BINTREE t = NULL;
printf("\nPlease input nodes of BINTREE: ");
createbintree(&t);
if(t!=NULL){
printf("The leverorder is: ");
leverorder(t);
}else{
printf("The bintree is empty ");
}
}