// 队列实现层次遍历
#include<iostream>
using namespace std;
typedef struct BiTNode
{
char data;
BiTNode *lchild,*rchild;
}*BiTree;
struct QNode
{
BiTNode data; // 注意:不可以是BiTree类型,不然delete时会破坏二叉树
QNode *next;
};
struct LinkQueue
{
QNode *front;
QNode *rear;
};
void CreateBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else {
T=new BiTNode; // 开辟空间
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
// 改变cout的顺序即可实现先序、中序、后序遍历
//void Traverse(BiTree T)
//{
// if(T) {
cout<<T->data;
// Traverse(T->lchild);
cout<<T->data;
// Traverse(T->rchild);
// cout<<T->data;
// }
//} // ABC##D#H##EF###
// 队列初始化
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
}
// 入队
void EnQueue(LinkQueue &Q,BiTree T)
{
QNode *p=new QNode;
p->data=*T;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
// 出队,判断队空即是否删除的是最后一个元素
void DeQueue(LinkQueue &Q,BiTree &T)
{
if(Q.front==Q.rear) return;
QNode *p=Q.front->next;
Q.front->next=p->next;
*T=p->data;
if(p==Q.rear) Q.rear=Q.front;
delete p;
}
// 判断队空
bool QueueEmpty(LinkQueue Q)
{
if(Q.front==Q.rear) return true;
return false;
}
// 层次遍历
void LevelTraverse(BiTree T)
{
LinkQueue Q;
InitQueue(Q);
if(T) EnQueue(Q,T); // 根节点不为空则入队
while(!QueueEmpty(Q))
{
DeQueue(Q,T);
cout<<T->data;
if(T->lchild) EnQueue(Q,T->lchild); //左节点不为空则入队
if(T->rchild) EnQueue(Q,T->rchild);
}
}
int main()
{
BiTree T;
CreateBiTree(T);
// Traverse(T);
LevelTraverse(T);
return 0;
}
运行结果: