广度优先搜索
广度优先搜索算法(Breadth-First-Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
实现方法
- 首先将根节点放入队列中。
- 从队列中取出第一个节点,并检验它是否为目标。
- 如果找到目标,则结束搜索并回传结果。
- 否则将它所有尚未检验过的直接子节点加入队列中。
- 若队列为空,表示整张图都检查过了——亦即图中没有欲搜索的目标。结束搜索并回传“找不到目标”。
- 重复步骤2。
代码实现
class Node {
constructor(data) {
this.data = data
this.children = []
this.parent = null
}
insertChild(child) {
this.children.push(child)
child.setParent(this)
}
setParent(parent) {
this.parent = parent
}
}
/*构造 tree */
let node0 = new Node(0)
let node1 = new Node(1)
let node2 = new Node(2)
let node3 = new Node('hello')
let node4 = new Node(4)
let node5 = new Node(5)
node0.insertChild(node1)
node0.insertChild(node2)
node1.insertChild(node3)
node1.insertChild(node4)
node2.insertChild(node5)
function bfsSearch(root, value) {
let list = []
let target
list.push(root)
while(list.length) {
target = list.shift()
if(target.data === value) return value
list.push(...target.children)
}
}
console.log(bfsSearch(node0, 'hello'))