广度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索图或树数据结构的算法。该算法从起始节点开始,逐层向外扩展,直到找到目标节点或遍历完所有节点。本文将详细介绍广度优先搜索算法的原理、实现及其应用。
广度优先搜索的基本思想是从起始节点开始,先访问所有相邻节点,然后再依次访问这些相邻节点的相邻节点,以此类推,层层推进。其基本步骤如下:
以下是广度优先搜索的JavaScript实现:
/**
* 广度优先搜索算法
* @param {Object} graph - 图的邻接表表示
* @param {string} start - 起始节点
*/
function breadthFirstSearch(graph, start) {
const queue = [start]; // 初始化队列,将起始节点加入队列
const visited = new Set(); // 用于记录已访问的节点
visited.add(start); // 将起始节点标记为已访问
while (queue.length > 0) {
const node = queue.shift(); // 取出队列的头节点
console.log(node); // 访问节点
// 访问当前节点的所有相邻节点
for (const neighbor of graph[node]) {
// 如果相邻节点未被访问过,将其标记为已访问并加入队列
if (!visited.has(neighbor)) {
visited.add(neighbor);
queue.push(neighbor);
}
}
}
}
// 示例图的邻接表表示
const graph = {
A: ['B', 'C'],
B: ['D', 'E'],
C: ['F'],
D: [],
E: ['F'],
F: []
};
// 调用广度优先搜索算法
breadthFirstSearch(graph, 'A'); // 输出: A B C D E F
breadthFirstSearch(graph, start)
:广度优先搜索算法,接受图的邻接表表示和起始节点作为参数。const queue = [start];
:初始化队列,将起始节点加入队列。const visited = new Set();
:初始化已访问节点集合,用于记录已访问的节点。visited.add(start);
:将起始节点标记为已访问。while (queue.length > 0)
:当队列不为空时,继续遍历。const node = queue.shift();
:取出队列的头节点。console.log(node);
:访问节点,打印节点值。for (const neighbor of graph[node])
:遍历当前节点的相邻节点。if (!visited.has(neighbor))
:如果相邻节点未被访问过。visited.add(neighbor);
:将相邻节点标记为已访问。queue.push(neighbor);
:将相邻节点加入队列,等待后续遍历。breadthFirstSearch
函数,进行广度优先搜索,并输出结果。/**
* 广度优先搜索算法(记录路径)
* @param {Object} graph - 图的邻接表表示
* @param {string} start - 起始节点
* @return {Object} - 每个节点的路径
*/
function breadthFirstSearchWithPath(graph, start) {
const queue = [[start]]; // 初始化队列,队列中存储路径
const visited = new Set(); // 用于记录已访问的节点
visited.add(start); // 将起始节点标记为已访问
while (queue.length > 0) {
const path = queue.shift(); // 取出队列的头路径
const node = path[path.length - 1]; // 获取路径中的最后一个节点
console.log(node); // 访问节点
// 访问当前节点的所有相邻节点
for (const neighbor of graph[node]) {
// 如果相邻节点未被访问过,将其标记为已访问并加入队列
if (!visited.has(neighbor)) {
visited.add(neighbor);
const newPath = [...path, neighbor]; // 创建新的路径
queue.push(newPath); // 将新路径加入队列
}
}
}
}
// 调用广度优先搜索算法(记录路径)
breadthFirstSearchWithPath(graph, 'A');
广度优先搜索(BFS)是一种用于遍历或搜索图或树数据结构的有效算法。它通过逐层推进的方式,从起始节点开始,先访问所有相邻节点,然后再依次访问这些相邻节点的相邻节点,以此类推,直到找到目标节点或遍历完所有节点。广度优先搜索算法实现简单,适用于最短路径搜索、连通性检查、层次遍历和求解迷宫问题等应用场景。