广度优先遍历从最底层(或者最高层)开始,向下(或向上)逐层访问每个节点,在每一层次上,从左到右(或从右到左)访问每个节点。这样就有4种访问方式。
当使用队列时,这种遍历方式的实现相当直接。假设从上到下、从左到右进行进行广度优先遍历。在访问了一个节点后,它的子节点(如果有的话)就放到队列的末尾,然后访问队列头部的节点。对于层次为n的节点,它的子节点位于第n+1层,如果将该节点的所有子节点都放到队列的末尾,那么,这些节点将在第n层的所有节点都访问后再访问。这样,就满足了“第n层的所有节点都必须在第n+1层的节点之前访问”的条件。
从上到下、从左到右的广度优先遍历实现:
#include<iostream>
template<class T>
void BST<T>::breadthFirst() {
Queue<BSTNode<T>*>queue;
BSTNode<T>* p = root;
if (p != 0) {
queue.enqueue(p);
while (!queue.empty()) {
p = queue.dequeue();
visit(p);
if (p->left)queue.enqueue(p->left);
if (p->right)queue.enqueue(p->right);
}
}
}