BFS 广度优先搜索。
首先了解,队列Queue: 是一种受限制的线性结构,先进先出。
创建一个队列:
// Java 版本
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
//add()和remove()方法在失败的时候会抛出异常(不推荐)
Queue<Type> queue = new LinkedList<Type>();
}
}
// JavaScript 实现
let Queue = (function () {
let items = new WeakMap
class Queue {
constructor () {
items.set(this, [])
}
enqueue (element) {
let q = items.get(this)
q.push(element)
}
dequeue () {
let q = items.get(this)
return q.shift()
}
front () {
let q = items.get(this)
return q[0]
}
isEmpty () {
let q = items.get(this)
return q.length === 0
}
size () {
let q = items.get(this)
return q.length
}
print () {
let q = items.get(this)
console.log(q.toString())
}
}
return Queue
})()
let q = new Queue();
队列常用操作(不限语言):
- 入队 push
- 出队 pop
- 判空 empty
- 统计元素 size
- 访问队首 front
BFS 框架:
void bfs(起始点) {
将起始点放入队列;
标记起点访问;
while( 如果队列不为空 ) {
访问队列中队首元素x;
删除队首元素;
for ( x 所有相邻点 ) {
if (该点未被访问且合法) {
该点加入队列末尾;
}
}
}
队列为空,广搜结束
}