分析:层次遍历(LeverlOrder)就是一层一层遍历,层次遍历需要借助队列来完成,队列:先进先出(FIFO)。 如图有一棵二叉树,按照层次遍历最终的结果就是ABCDEFG,首先将根结点A入队列。 然后根结点出队,并访问A结点,发现A结点既有左孩子也有右孩子,那么就分别将左右孩子入队,此时队列中有BC。 A的左右孩子都入队了,然后将队头结点B出队并访问,此时序列为AB,B有左右孩子,所以将B的左右孩子DE入队,队中此时有CDE。 然后队头结点C出队并访问,C有左右孩子,所以将C的左右孩子FG入队。此时队列里有DEFG。 然后队头结点D出队并访问,D没有左右孩子,所以没有可入队的结点。 继续让队头结点E出队并访问,E没有左右孩子,所以没有可入队的结点。 FG同理,此时队列为空,结束。最终层次遍历序列为:ABCDEFG。
算法思想:层次遍历使用一个队列(先进先出),将根结点入队,出队,然后访问出队结点,若它有左孩子,就将左孩子入队,若它有右孩子,就将右孩子入队,然后访问队头结点,如此循环下去,直到队列为空,就结束了。 代码:
void LeverlOrder(BiTree T){
InitQueue(Q);
BiTree *p;
EnQueue(Q,T);
while(!IsEmpty(Q)){
DeQueue(Q,p);
visit(p);
if(p->lchild!=NULL)
EnQueue(Q,p->lchild);
if(p->rchild!=NULL)
EnQueue(Q,p->rchild);
}
}
注解:
|