【问题标题】:Dictionary graph to list by breadth-first order按广度优先顺序列出的字典图
【发布时间】:2025-12-13 17:40:01
【问题描述】:

我有以下图表(在这种情况下是二叉树)作为字典。

G = {
    'root': ['4', '3'],
    '4': ['2', 'a'],
    '3': ['1', 'd'],
    '2': ['b', 'e'],
    '1': ['f', 'c']
    }

我想要一个以广度优先顺序返回列表表示的函数,如下所示:

arr = ['root','4','3','2','a','1','d','b','e',None,None,'f','c',None,None ]

如果我想实现的目标不清楚,请告诉我,我会提供更多信息:)

到目前为止,我的想法是从 dict 中读取根元素,然后获取子节点,然后读取每个子节点,同时将每个子节点推送到列表中,但这有点令人困惑和我会很感激一些帮助。

【问题讨论】:

  • 你能发布你的尝试吗?
  • 我仍在尝试实现我的尝试,并且我知道我需要广度优先搜索,但在字典上实现它时遇到了麻烦。

标签: python python-3.x binary-tree binary-search-tree binary-search


【解决方案1】:

我认为您的预期输出不正确。有 6 个叶节点,每个节点都有两个 None 子节点,但您的预期输出中只有 4 个 Nones,而不是 12 个。

使用以下代码:

from collections import deque
def bf(tree, node='root'):
    output = []
    queue = deque([node])
    while queue:
        node = queue.popleft()
        output.append(node)
        if node is not None:
            for i in tree.get(node, [None, None]):
                queue.append(i)
    return output
print(bf(G))

它会输出:

['root', '4', '3', '2', 'a', '1', 'd', 'b', 'e', None, None, 'f', 'c', None, None, None, None, None, None, None, None, None, None]

注意属于节点befc 的另外8 个None

【讨论】:

  • 你说的很对,你的回答正是我需要的,非常感谢:)
  • 我会让q 成为collections.deque,它是一个先进先出队列而不是一个列表。 q.pop(0) 当前每次都复制列表的其余部分。我也会避免使用单一名称变量,尤其是o
  • @FHTMitchell 确实如此。我已经相应地更新了我的答案。
最近更新 更多