这是记录在学习二叉树层序遍历的代码。
由于在书上,我只看到关于层序遍历的函数定义,
但在写完整代码时,遇到很多问题。
后面看了许多别的实例,终于写出了完整的代码;
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct Tree{
int data; // 存放数据域
struct Tree *lchild; // 遍历左子树指针
struct Tree *rchild; // 遍历右子树指针
}Tree,*BitTree;
typedef struct{ //定义一个队列
BitTree data[MaxSize]; //*****主要是此处的data定义为BiTtree
int front,rear;
}SqQueue;
void initqueue(SqQueue *q){ //初始化一个队列
q->front = q->rear = 0;
}
int inqueue(SqQueue *q,BitTree x){ //入队
if((q->rear+1)%MaxSize == q->front)
{
return 0;
}
q->data[q->rear] = x;
q->rear=(q->rear+1)%MaxSize;
return 1;
}
BitTree chuqueue(SqQueue *q){ //出队
BitTree x;
x=q->data[q->front];
q->front = (q->front +1)%MaxSize;
return x;
}
BitTree CreateLink()
{
int data;
int temp;
BitTree T;
scanf("%d",&data); // 输入数据
temp=getchar(); // 吸收空格
if(data == -1){ // 输入-1 代表此节点下子树不存数据,也就是不继续递归创建
return NULL;
}else{
T = (BitTree)malloc(sizeof(Tree)); // 分配内存空间
T->data = data; // 把当前输入的数据存入当前节点指针的数据域中
printf("请输入%d的左子树: ",data);
T->lchild = CreateLink(); // 开始递归创建左子树
printf("请输入%d的右子树: ",data);
T->rchild = CreateLink(); // 开始到上一级节点的右边递归创建左右子树
return T; // 返回根节点
}
}
void LevelOrder(BitTree T){ //层序遍历函数
SqQueue Q;
initqueue(&Q);
BitTree p;
inqueue(&Q,T);
while(Q.front != Q.rear){
p = chuqueue(&Q);
printf("%d",p->data);
if(p->lchild)
{
inqueue(&Q,p->lchild);
}
if(p->rchild)
{
inqueue(&Q,p->rchild);
}
}
}
void ShowXianXu(BitTree T) // 先序遍历二叉树
{
if(T==NULL)
{
return;
}
printf("%d",T->data);
printf("/ \\");
ShowXianXu(T->lchild); // 递归遍历左子树
ShowXianXu(T->rchild); // 递归遍历右子树
}
int main()
{
BitTree S;
printf("请输入第一个节点的数据:\n");
S = CreateLink(); // 接受创建二叉树完成的根节点
//ShowXianXu(S); // 先序遍历二叉树
LevelOrder(S);
return 0;
}
这个代码仅供参考;
在我的电脑是没有运行错误的;
个人写,肯定会有没考虑到的地方,望见谅。