#include<iostream>
using namespace std;
#define OVERFLOW -2
//定义二叉树类型
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//定义队列类型
#define MAXQSIZE 100
typedef struct{
BiTree *base;
int front,rear;
}SqQueue;
//初始化二叉树
void InitBiTree(BiTree &T){
T=NULL;
}
//创建二叉树
void CreateBiTree(BiTree &T){
char data;
cin>>data;
if(data!='#'){
T=new BiTNode;
T->data=data;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
else T=NULL;
}
int InitQueue(SqQueue &Q){
Q.base=new BiTree[MAXQSIZE];
if(!Q.base) return 0;
Q.front=Q.rear=0;
return 1;
}
//队空
int QueueEmpty(SqQueue Q){
if(Q.front==Q.rear) return 1;
else return 0;
}
//入队
int EnQueue(SqQueue &Q,BiTNode *e){ //PS:BiTNode *e也可写成BiTree e
if((Q.rear+1)%MAXQSIZE==Q.front) exit(OVERFLOW); //队满,上溢
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return 1;
}
//出队
int DeQueue(SqQueue &Q,BiTNode* &e){ //e为指针引用 PS:BiTNode* &e也可写成BiTree &e
if(QueueEmpty(Q)) exit(OVERFLOW); //队空,下溢
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return 1;
}
//层次遍历
void LevelOrder(BiTree T){
BiTNode *p=T; //p指针用来遍历二叉树,初始值为根结点
SqQueue Q;
InitQueue(Q);
EnQueue(Q,p); //根结点入队
while(!QueueEmpty(Q)){
DeQueue(Q,p); //出队
cout<<p->data<<' '; //访问出队结点
if(p->lchild!=NULL) EnQueue(Q,p->lchild); //左孩子入队
if(p->rchild!=NULL) EnQueue(Q,p->rchild); //右孩子入队
}
}
int main(){
BiTree T;
InitBiTree(T);
cout<<"请输入结点元素:";
CreateBiTree(T);
cout<<"层次遍历结果为:";
LevelOrder(T);
return 1;
}
运行结果:
备注:BiTNode* &e用到指针引用,可实现主函数中的p指针随之修改。
详见C指针-对int &e和int星 &e的理解_静安书以沫的博客-CSDN博客代码第16行和24行