如何在Python上有向图非递归地实现广度优先搜索

时间:2019-05-07 20:45:21

标签: python breadth-first-search

我正在尝试实现BFS函数,该函数将打印使用广度优先搜索遍历访问的有向图节点列表。该函数必须以非递归方式实现,并且必须遍历图中的所有节点,因此,如果有多个树,它将以以下方式打印:

树1:a,b

树2:d,e,h

树3:.....

我的主要困难是,如果图形有几棵树,如何理解BFS函数如何遍历所有节点,而又不重印以前访问过的节点。

2 个答案:

答案 0 :(得分:1)

为简单起见,您可以使用队列以非递归方式执行BFS。这里需要两个数据结构。

  1. 维护BFS顺序的队列。
  2. 列出项哈希表(或集合)以查找重复项。

这是算法:

  1. 将图上的初始点排入队列,然后将 哈希表。
  2. 如果队列不为空
    1. 从队列中出队。
    2. 将出队元素的所有邻居加入队列,如果它们在集合中尚不存在,则将其插入到集合中。
    3. 打印(/访问/处理)出队元素。
  3. 重复步骤2到4,直到队列用完。

您可以在线找到许多示例和优化。例如:

https://www.geeksforgeeks.org/breadth-first-search-or-bfs-for-a-graph/

https://en.wikipedia.org/wiki/Breadth-first_search

答案 1 :(得分:0)

BFS通常使用队列来完成。处理节点时,将其子节点推入队列。处理完该节点后,您将处理队列中的下一个节点。

这本质上是非递归的。