算法设计
二叉树的层序遍历用到的是队列,创建二叉树时用的是递归的方法。在层序遍历时用队列来存储结点。
层序遍历二叉树:
首先,让根结点入队,然后执行一个循环,条件是:队列不为空。也就是队列不为空时,令一个结点出队,然后输出该结点的data中的数据,并判断该结点的左右孩子是否存在,若存在,则将它们分别入队。再次执行该循环,直到队列为空,结束。
代码:
#include "stdio.h"
#include "stdlib.h"
#define MAXQSIZE 100 //最大队列长度
typedef char SElemType;
typedef struct TreeNode{
SElemType data;
struct TreeNode *lchild,*rchild;
}TreeNode,*BiTree;
//创建树
int CreateTree(BiTree *root){
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#'){
*root=NULL;
}else{
*root=(TreeNode *)malloc(sizeof(TreeNode));
if(!*root)
exit(-1);
(*root)->data=ch;
CreateTree(&((*root)->lchild));
CreateTree(&((*root)->rchild));
}
return 0;
}
typedef struct{
BiTree *base;
int front; //头指针
int rear; //尾指针
}SqQueue;
//创建循环队列
int InitQueue(SqQueue *q){
q->base=(BiTree *)malloc(MAXQSIZE * sizeof(BiTree));
if(!q->base)
exit(0); //分配失败
q->front=0;
q->rear=0;
return 1;
}
//返回队列q的元素个数
int QueueLength(SqQueue q){
return (q.rear-q.front+MAXQSIZE)%MAXQSIZE;
}
//向q队尾插入元素
int EnQueue(SqQueue *q,BiTree e){
if((q->rear+1)%MAXQSIZE==q->front) //队列满
return 0;
q->base[q->rear]=e;
q->rear=(q->rear+1)%MAXQSIZE;
return 1;
}
//删除q的队首元素,用e返回其值
int DeQueue(SqQueue *q,BiTree *e){
if(q->front==q->rear) //队列为空
return 0;
*e=q->base[q->front];
q->front=(q->front+1)%MAXQSIZE;
return 1;
}
//队列判空
int QueueEmpty(SqQueue *q){
if(q->front==q->rear)
return 1;
else
return 0;
}
//队列判满
int QueueFill(SqQueue *q){
if((q->rear+1)%MAXQSIZE==q->front)
return 1;
else
return 0;
}
//层序遍历
void seOrder(BiTree tree){
SqQueue q;
BiTree e;
InitQueue(&q);
BiTree p=tree;
if(p->lchild!=NULL||p->rchild!=NULL)
EnQueue(&q,p);
while(!QueueEmpty(&q)){
DeQueue(&q,&e);
printf("%c ",e->data);
if(e->lchild!=NULL){
EnQueue(&q,e->lchild);
}
if(e->rchild!=NULL){
EnQueue(&q,e->rchild);
}
}
}
int main(){
BiTree tree;
CreateTree(&tree);
printf("\n层序遍历:");
seOrder(tree);
system("pause");
return 0;
}