宽度优先遍历
使用 HashSet 的目的就是为了防止直接邻居的重复进入导致进入死循环。
package algorithmbasic.class17;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
//图的宽度优先遍历
public class BFS {
//只要进行宽度优先遍历就要指定一个开始节点。
//-> 从哪个节点开始进行宽度优先遍历。
//注意这里的节点是图类型的节点。
public static void bfs(Node start) {
//创建一个set目的是为了防止多个直接邻居进入队列从而导致循环无法结束。
HashSet<Node> set = new HashSet<>();
//进行宽度优先遍历的必备神器。
Queue<Node> queue = new LinkedList<>();
//放的时候一起放。
queue.add(start);
set.add(start);
while (!queue.isEmpty()) {
Node cur = queue.poll();
//将当前节点的直接邻居放入队列中。
for (int i = 0; i < cur.nexts.size(); i++) {
//如果set中存在说明之前进入过,就不用再进了。
if (!set.contains(cur.nexts.get(i))) {
queue.add(cur.nexts.get(i));
set.add(cur.nexts.get(i));
}
}
System.out.print(cur.value + " ");
}
}
}