Javascript 中的广度优先搜索遍历

web developmentfront end technologyjavascript

BFS 在访问子顶点之前先访问邻居顶点,搜索过程中使用队列。以下是 BFS 的工作原理 −

  • 访问相邻的未访问顶点。将其标记为已访问。显示它。将其插入队列。
  • 如果未找到相邻顶点,则从队列中移除第一个顶点。
  • 重复规则 1 和规则 2,直到队列为空。

让我们看一下 BFS 遍历的工作原理:

步骤
遍历
描述
1
初始化队列。
2
我们首先访问 S (起始节点),并将其标记为已访问。
3
然后,我们从 S 中看到一个未访问的相邻节点。在此示例中,我们有三个节点,但按字母顺序我们选择 A,将其标记为已访问并将其入队。
4
接下来,来自 S的未访问相邻节点是 B。我们将其标记为已访问并将其入队。
5
接下来,来自 S的未访问相邻节点是 C。我们将其标记为已访问并将其入队。
6
现在,S 已没有未访问的相邻节点。因此,我们出队并查找 A
7
 A 我们有 作为未访问的相邻节点。我们将其标记为已访问并将其入队。

在此阶段,我们没有未标记(未访问)的节点。但根据算法,我们继续出队以获取所有未访问的节点。当队列清空时,程序结束。

让我们看看如何在 JavaScript 中实现这一点。 

示例

BFS(node) {
   // 创建一个队列并在其中添加我们的初始节点
   let q = new Queue(this.nodes.length);
   let explored = new Set();
   q.enqueue(node);

   // 将第一个节点标记为已探索。
   add(node);

   // 我们将继续,直到队列为空
   while (!q.isEmpty()) {
      let t = q.dequeue();

      // 记录从队列中出来的每个元素
      console.log(t);

      // 1. 在边缘对象中,我们搜索此节点直接连接到的节点。
      // 2. 我们过滤掉已经被探索过的节点。
      // 3. 然后我们将每个未探索的节点标记为已探索并将其添加到队列中。
      this.edges[t]
      .filter(n => !explored.has(n))
      .forEach(n => {
         explored.add(n);
         q.enqueue(n);
      });
   }
}

You can test this function using −

示例

let g = new Graph();
g.addNode("A");
g.addNode("B");
g.addNode("C");
g.addNode("D");
g.addNode("E");
g.addNode("F");
g.addNode("G");

g.addEdge("A", "C");
g.addEdge("A", "B");
g.addEdge("A", "D");
g.addEdge("D", "E");
g.addEdge("E", "F");
g.addEdge("B", "G");

g.BFS("A");

输出

这将给出输出 −

A
C
B
D
G
E
F

相关文章