【问题描述】编写按层次顺序(同一层自左至右)遍历二叉树的算法
【输入形式】A B * C * * D * *
【输出形式】A B D C
/*
1.顺序循环队列
2.二叉树先序创建
3.二叉树层次遍历(队列实现)
*/
#include<stdio.h>
#include<iostream>
#include<malloc.h>
#define MAX 50
using namespace std;
/* 二叉树结构 */
typedef struct BTree{
char data;
struct BTree *lchild,*rchild;
}BiTNode,*BiTree;
/* 顺序队列 */
typedef struct {
BiTree qu[MAX];
int front,rear;
}Queue;
/* 先序创建 二叉树 */
void CreatBinaryTree(BiTree &T){
//输入的字符
char ch;
scanf("%c",&ch);
//叶子结束符 ‘*’
if(ch=='*') T = NULL;
else{
//分配内存
T=(BiTNode *)malloc(sizeof(BiTNode));
//T = (BiTree)malloc(sizeof(BiTNode));
//数据域
T->data = ch;
//递归创建左右子树
CreatBinaryTree(T->lchild);
CreatBinaryTree(T->rchild);
}
}
/* 队列初始化 */
void InitQueue(Queue &q){//‘&’ 引用传递 !
q.front = 0;
q.rear = 0;
}
/* 从尾部入队 */
void EnterQueue(Queue &q,BiTree &p){
//取余 -> 队列是否排满
if((q.rear+1)%MAX != q.front){
//队尾入队
q.qu[q.rear] = p;
//队尾下标后移
q.rear = (q.rear+1)%MAX;
}
}
/* 从队头出队 */
void QuitQueue(Queue &q,BiTree &p){
if(q.front != q.rear){
//将数据域中的数据取出来
p = q.qu[q.front];
//队头下标后移
q.front = (q.front + 1)%MAX;
}
}//注意!在处理队头队尾下标时不要忘了取余
/* 二叉树层次遍历 */
void FloorTraverse(BiTree &T){
// 一个二叉树操作结点、 一个队列
BiTree p;
Queue q;
//初始化
p = T;
InitQueue(q);
if(p){
//将二叉树根节点入队
EnterQueue(q, p);
//队列 为空是循环结束条件 -> 队列进队出队顺序就是层次遍历的顺序
while(q.front != q.rear){
//出队、 访问(visit)
QuitQueue(q,p);
cout<<p->data;
//将此节点的左右子树分别从队尾入队
if(p->lchild)
EnterQueue(q,p->lchild);
if(p->rchild)
EnterQueue(q,p->rchild);
}
}
}
/* 主函数 */
int main(){
BiTree T;
CreatBinaryTree(T);
FloorTraverse(T);
return 0;
}