要进行层次遍历,需要建立一个循环队列。先将二叉树头结点入队列,然后出队列,访问该结点,如果它有左子树,则将左子树的根结点入队;如果它有右子树,则将右子树的根结点入队。然后出队,对出队结点访问,如此反复,直到队列为空为止。
层次遍历函数如下:
/*
树的层次遍历。
需要建立一个队列,直到队列为空为止。
*/
void Level(BTNode *p)
{
if(p!=NULL)
{
int front,rear;
BTNode *que[maxsize]; //指针型数组,作为队列。
front=rear=0; //初始化循环队列。
BTNode *q;
rear=(rear+1)%maxsize; //根节点入队。
que[rear]=p;
while(front!=rear) //当队列不空的时候进行循环。
{
front=(front+1)%maxsize;
q=que[front]; //队头结点出队。
Visit(q); //访问队头结点。
if(q->lchild!=NULL) //若左子树不为空,则左子树根节点入队。
{
rear=(rear+1)%maxsize;
que[rear]=q->lchild;
}
if(q->rchild!=NULL)
{
rear=(rear+1)%maxsize;
que[rear]=q->rchild;
}
}
}
}
包括构造二叉树过程,完整的测试代码如下:
#include<iostream>
using namespace std;
int const maxsize=20;
typedef char Elemtype;
typedef struct BTNode
{
Elemtype data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
/*
插入数据元素,使二叉树成为一颗二叉搜索树。
规定左子树(数据域)小于右子树(数据域)。
*/
BTNode* Insert(BTNode *p,Elemtype data)
{
if(NULL==p)
{
p=(BTNode *)malloc(sizeof(BTNode));
p->data=data;
p->lchild=NULL;
p->rchild=NULL;
}
else
{
if(data<p->data)
{
p->lchild=Insert(p->lchild,data);
}
else
{
p->rchild=Insert(p->rchild,data);
}
}
return p;
}
/*
初始化二叉树。
对树结构进行修改,第一个参数必须使用引用(&),
否则,应当返回修改后的树根节点,如图Insert()函数的操作。
*/
void Init(BTNode *&p,Elemtype a[],int n)
{
if(n!=0)
{
for(int i=0;i<n;++i)
{
p=Insert(p,a[i]);
}
}
}
/*
对二叉树结点的访问操作。
*/
void Visit(BTNode *p)
{
cout<<p->data<<endl;
}
/*
先序遍历二叉树。
*/
void PreOrder(BTNode *p)
{
if(p!=NULL)
{
Visit(p);
PreOrder(p->lchild);
PreOrder(p->rchild);
}
}
/*
树的层次遍历。
需要建立一个队列,直到队列为空为止。
*/
void Level(BTNode *p)
{
if(p!=NULL)
{
int front,rear;
BTNode *que[maxsize]; //指针型数组,作为队列。
front=rear=0; //初始化循环队列。
BTNode *q;
rear=(rear+1)%maxsize; //根节点入队。
que[rear]=p;
while(front!=rear) //当队列不空的时候进行循环。
{
front=(front+1)%maxsize;
q=que[front]; //队头结点出队。
Visit(q); //访问队头结点。
if(q->lchild!=NULL) //若左子树不为空,则左子树根节点入队。
{
rear=(rear+1)%maxsize;
que[rear]=q->lchild;
}
if(q->rchild!=NULL)
{
rear=(rear+1)%maxsize;
que[rear]=q->rchild;
}
}
}
}
int main()
{
BTNode *t=NULL;
Elemtype e[]={'d','e','f','g','h','a','b','c'};
Init(t,e,sizeof(e)/sizeof(e[0]));
PreOrder(t);
cout<<endl;
Level(t);
return 0;
}