Javascript中的广度优先搜索遍历

119 阅读5分钟

在这个现代技术世界中,我们需要使用技术来以编程方式遍历树,尽管我们的计算机有一个友好的界面来浏览我们的文件树,为此目的,广度优先搜索(BFS)是最有用的算法。

广度优先搜索是一种遍历算法,用于逐层 搜索或遍历树或图的数据结构。在转到下一个深度层的子节点之前,它要访问存在于当前深度的每个节点。

本文将用一个适当的例子解释如何运行广度优先搜索算法。那么,让我们开始吧

广义优先搜索算法如何在JavaScript中工作

广度优先搜索算法的工作包括以下步骤。

  • 选择一个节点并创建一个包含其所有邻居节点的队列
  • 从队列中删除那些被访问的节点,并将其标记。
  • 在队列中添加其所有的邻居节点
  • 重复进行,直到队列变空或你达到目标。

如果一个节点在没有被标记为已访问之前被重新访问,那么程序将被停止。因此,将节点标记为已访问,那么它将不会被再次搜索。

广义优先搜索遍历算法的实现

广度优先搜索从左到右遍历树木,然后从上到下**(父节点到子节点**),确保所有存在于当前深度的节点被访问。

现在,让我们看一个小例子来了解BFS遍历的工作原理。这里,给定的无向图有5个节点**"0"、"1"、"2"、"3"、"4"。**

现在我们将在指定的图上使用这种遍历算法。

第1步:队列的初始化

首先,我们要 初始化队列 "q"。

第2步:选择起始节点

接下来,我们将选择起始节点。为此,我们将选择**"0 "作为起始节点,并将其标记为已访问**。

第3步:开始节点的未访问的相邻节点

起始节点已被访问并标记;现在,我们将检查其相邻节点。在下面的插图中,起始节点 "0 "三个未访问的相邻节点 "1"、"2 "和 "3";但是,由于计数的顺序,我们将选择节点"1"。然后,标记已访问,并添加队列中

现在,"0 "未访问节点是 "2",它也被标记为已访问并添加到队列中。

然后,我们将访问最后一个未访问的相邻节点,也就是**"3",将其标记为已访问并**排队。

第4步:退出起始节点

现在我们选择的起始节点**"0 "没有任何未访问的相邻节点,所以我们将移除队列并搜索节点"1"。**

第5步:检查节点 "1 "的未访问的相邻节点

在这一点上,节点**"1 "**有节点 **"4 "**作为其未访问的相邻节点。

节点**"4 "现在被标记为 已访问并添加到队列中。现在,我们已经没有未访问的节点了。然而,根据算法**,我们将获得所有未访问的节点,并继续按照程序从队列中删除节点。当队列变空时,程序将结束。

让我们实现一个例子来检查面包优先搜索在JavaScript中是如何工作的。

如何在JavaScript中实现宽度优先搜索遍历

要在JavaScript中实现宽度优先搜索遍历,首先我们要创建一个图。

let graph;

上面给出的图是用来说明广度优先搜索的,它有**"5 "个节点。因此,在这里我们将定义"5 "**个节点。

const nodes = 5;

现在,创建一个 "visited[ ]"数组,用来存储访问过的节点,该数组的长度将根据节点的数量来设置。

let visited = new Array(nodes);

接下来,我们将定义**"createGraph() "函数,目的是创建一个图并向其添加节点。然后,"for "循环将执行到图的长度。在这个循环中,有一个二维数组,用来表示初始化为"0 "的图的边。**

const createGraph = (nodes) => {
graph = new Array(nodes);
for (let i = 0; i < graph.length; i++) {
graph[i] = new Array(nodes);
}for (let i = 0; i < graph.length; i++) {
for (let j = 0; j < graph[i].length; j++) {
graph[i][j] = 0;
}
}
};

然后,我们将定义**"addEdge() "函数,接受两个参数 "a "和 "b"。这个函数将检查两个节点之间的边。如果发现两个节点之间有边,那么"addEdge() "函数将在创建的图(二维数组)中用 "1 "替换 "0 "条目。 同时,添加"1 "**表示传递的节点参数之间有一条边。

const addEdge = (a, b) => {
for (let i = 0; i < graph.length; i++) {
for (let j = 0; j < graph[i].length; j++) {
if (i === a && j === b) {
graph[i][j] = 1;
graph[j][i] = 1;
}
}
}
}

现在,我们将定义**"breadthFirstSearch() "函数。首先,我们将创建一个空的"队列"。**开始时,所有的节点都没有被访问过,所以用 **"visited[i] = false "**语句将它们标记为假。然后,我们将选择作为参数传递给 **"breadthFirstSearch() "函数的起始"节点 "**并将其标记为已访问。**queue.push() "方法将把"节点 "推到队列中,然后"while "循环将执行到队列的长度。这个循环将检查"currentNode "**与其余节点的边缘。

在**"for "循环中,添加的"if "条件"[currentNode][j] ===1 "将检查"currentNode "和其余"j "节点之间的边缘。在这种情况下,如果两个节点之间有一条边,而对应的"j "节点还没有被访问,那么它将被标记为"已访问 "并被推到 "队列 "中。**

const breadthFirstSearch = (node) => {
const queue = [];for (let i = 0; i < visited.length; i++) {
visited[i] = false;
}visited[node] = true;
queue.push(node);

while (queue.length) {
let currentNode = queue.shift();

console.log(`visiting ${currentNode}`);
for (let j = 0; j < graph[currentNode].length; j++) {
if (graph[currentNode][j] === 1 && visited[j] === false) {
visited[j] = true;
queue.push(j);
}
}
}
};

接下来,我们将调用**"createGraph() "函数**,并将 **"nodes "**作为参数传递。

createGraph(nodes);

这样做之后,用**"addEdge() "函数**指定节点 "0, 1, 2, 3 "的边,如上面给出的图中所示。

addEdge(0, 1);
addEdge(0, 2);
addEdge(0, 3);
addEdge(1, 0);
addEdge(1, 4);
addEdge(2, 0);
addEdge(2, 4);
addEdge(3, 0);
addEdge(3, 4);

这里,"0 "被作为起始节点传递给BFS()函数,它将执行进一步的操作。

breadthFirstSearch(0);

BFS()方法将遍历图中的节点,并在控制台中输出所访问的节点。

以上就是关于JavaScript中的宽度优先搜索遍历算法的所有有用信息。如果需要,请进一步研究。

结论

广度优先搜索(BFS)是一种遍历算法,用于逐层搜索或遍历树或图的数据结构。在进入下一个深度层的子节点之前,它要访问存在于当前深度的每个节点。在这篇文章中,我们通过一个合适的例子,简要地讨论了广度优先搜索遍历的JavaScript算法和它的工作。