Python构造BFS

时间:2017-09-21 04:24:06

标签: python

我在网上找到了很多BFS个示例代码,但输入的格式与我的格式不同,输出效果不如预期。

我有一个节点列表nodesList,每个节点对象都有一个节点id,并且在id中包含其所有neighboursList个邻居节点。现在我想使用BFS构建nodesList。据我所知,如果我知道,可以进行计算并构建BFS

  • BFS [级别1:根等等]的每个级别中有哪些节点

  • BFS

  • 中每个节点的父节点
  • BFS

  • 中每个节点的子节点
  • BFS

  • 中每个节点的节点id节点BFS

所以我创建了另一个名为BFSnode的类,它存储了我需要的信息。虽然我总能找到前两个级别,因为我不知道输入图形有多大,但我很困惑如何使用递归动态地找到这些级别。由于我不熟悉动态编程和递归,如果有人可以帮助我,我们将不胜感激。非常感谢。

1 个答案:

答案 0 :(得分:0)

要进行广度优先搜索,您不需要使用递归或动态编程。

广度优先搜索通常使用队列数据结构:
1.首先将根节点或要开始搜索的节点添加到队列中 2.队列中有节点时,首先将下一个节点出列。然而,您需要处理它并将其孩子排队。
3.当队列为空时搜索结束。

粗糙代码(未经测试):

class Node(object):
    def __init__(self, val):
        self.val = val
        self.children = []

def breadth_first_search(root):
    next_nodes = Queue()
    next_nodes.enqueue(root)

    while not next_nodes.empty():
        cur_node = next_nodes.dequeue()

        # Do something with cur_node

        for child in cur_node.children:
            next_nodes.enqueue(child)

我假设存在一个Queue对象,它支持enqueue,dequeue和empty,它不是python中的内置函数。您可以编写自己的,使用列表,或使用collections.deque和append()和popleft()而不是enqueue和dequeue。

我还假设图表没有周期。看起来你正在使用树木,所以这可能是一个安全的假设。