关于森林(孩子-兄弟链表形式)的层次遍历:它类似于图的广度优先搜索(BFS)
首先要清楚孩子-兄弟链表表示森林的特点。
接下来看伪代码:
//使用队列来依次存储同层结点
void LevelTraverse(csTree T) { //csTree 表示树的结构体指针
csTree P = T;
csTree K ;
Queue sqQueue; //声明一个队列
InitQueue(&sqQueue); //初始化一个队列
while (P) //这里的 P 是指森林中可能有多棵子树,指向每棵子树的根节点
{
K = P; //利用 K 来遍历以 P 为根节点子树中的节点
EnQueue(&sqQueue, K); //先将根节点入队
while (!IsEmpty(&sqQueue)) { //只要队列不为空,则依次出队,直到队空
OutQueue(&sqQueue, &K); //出队
cout << K->data << "\t"; //打印该元素
if (K->firstChild) { //如果该节点不是森林中的叶节点,则进入下一层
K = K->firstChild; //将 K 指向 K 最左边的孩子
EnQueue(&sqQueue, K); //入队
while (K->nextSibling) { //判断它是否有兄弟节点
K = K->nextSibling;
EnQueue(&sqQueue, K);//入队它的兄弟节点(在同一层上)
}
}
}
P = P->nextSibling; //指向下一棵树的根节点
}
}