运行结果:
链队实现的层次遍历
#include<iostream>
using namespace std;
typedef struct BiTNode
{
char data;
BiTNode *lchild,*rchild;
}*BiTree;
struct QNode
{
BiTNode data; // 也可以是BiTree类型,但下面要做相应改变
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);
}
}
// 队列初始化
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;
}
循环队列实现层次遍历:
// 顺序队列实现层次遍历
#include<iostream>
using namespace std;
#define maxsize 100
typedef struct BiTNode
{
char data;
BiTNode *lchild,*rchild;
}*BiTree;
struct SqQueue
{
BiTNode *base;
int front,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);
}
}
// 队列初始化
void InitQueue(SqQueue &Q)
{
Q.base=new BiTNode[maxsize];
Q.front=Q.rear=0;
}
// 入队,队满:(Q.rear+1)%maxsize==Q.front
void EnQueue(SqQueue &Q,BiTree T)
{
if((Q.rear+1)%maxsize==Q.front) return;
Q.base[Q.rear]=*T;
Q.rear=(Q.rear+1)%maxsize;
}
// 出队,队空:Q.rear==Q.front
void DeQueue(SqQueue &Q,BiTree &T)
{
if(Q.rear==Q.front) return;
*T=Q.base[Q.front];
Q.front=(Q.front+1)%maxsize;
}
// 判断队空
bool QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear) return true;
return false;
}
// 层次遍历
void LevelTraverse(BiTree T)
{
SqQueue 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;
}
有问题还请指出,谢谢!