所谓层次遍历是指从二叉树的根结点开始从上到下逐层遍历该二叉树,在同一层次中从左到右依次访问各个结点。
由层次遍历的定义可知,层次遍历是从根结点开始访问,然后访问它的左孩子和右孩子,接下来是它左孩子的左孩子和右孩子,右孩子的左孩子和右孩子······。即在访问完某个结点后,一般不能马上访问它的左孩子和右孩子(除根结点等特殊情况外),需要把它的左右孩子信息保存起来。这种方式正好与队列的操作特点吻合,所以可利用一个队列结构来实现层次遍历,其做法是:
(1).首先将根结点入队列
(2).当队列不空,从队列中取出队头结点访问它,并在其左右孩子非空时,把它的左孩子结点和右孩子结点一次入队列。
(3).反复执行(2),知道队列为空时为止。
在下面层次遍历算法中,二叉树以二叉链表存储,用一维数组queue[MAXSIZE]实现循环队列,变量front和rear为分别表示队头指针和队尾指针的指示器变量,并假定有足够空间不会发生上溢。
#define MAXSIZE 100
void levelorder(bitree bt)//层次遍历二叉树
{
bitree queue[MAXSIZE];//定义队列
int front,rear;//定义队列指针
if(bt==NULL) return ;//如果是空树则返回
front=0; rear=0;//队列指针初始化
queue[++rear]=bt;//根结点入队列
while(rear!=front)//当队列不空时反复做
{
front=(front+1)%MAXSIZE;//队头结点出队列
printf("%d\n",queue[front]->data);//访问对头结点,假定为整型
if(queue[front]->lchild!=NULL)//队头结点的左孩子域不空
{
rear=(rear+1)%MAXSIZE;//修改队尾指针
queue[rear]=queue[front]->lchild;//队头结点的左孩子入队列
}
if(queue[front]->rchild!=NULL)
{
rear=(rear+1)%MAXSIZE;
queue[rear]=queue[rear]->rchild;
}
}
}