python - 在有向树的广度优先搜索中跟踪深度
问题描述
我正在尝试查找根与正在遍历的节点的深度之间的距离,例如,如果我有一个表示树的以下邻接列表,{ 1: [2, 3], 2: [4], 3: [5]}
则会创建如下所示的关联列表,[0, 1, 1, 2, 2]
表示每个节点的级别.
我有以下代码,看不到我要在哪里添加计数功能等,理想情况下,这也可以处理交叉和后边缘
def bfs(graph, root):
seen, queue = set([root]), collections.deque([root])
visit_order = []
while queue:
vertex = queue.popleft()
visit_order.append(vertex)
for node in graph[vertex]:
if node not in seen:
seen.add(node)
queue.append(node)
print(visit_order)
解决方案
您可以将节点及其级别作为元组排队,而不是仅将节点排队,并且当您将节点排队时,它总是与当前级别加一耦合,因此当您将节点出列并将节点附加到您时,visit_order
您也可以获得元组中节点的级别:
import collections
def bfs(graph, root):
seen, queue = {root}, collections.deque([(root, 0)])
visit_order = []
levels = []
while queue:
vertex, level = queue.popleft()
visit_order.append(vertex)
levels.append(level)
for node in graph.get(vertex, []):
if node not in seen:
seen.add(node)
queue.append((node, level + 1))
print(visit_order)
print(levels)
以便:
bfs({ 1: [2, 3], 2: [4], 3: [5]}, 1)
会输出:
[1, 2, 3, 4, 5]
[0, 1, 1, 2, 2]
推荐阅读
- assembly - 浮点加法组装算法
- sorting - Elasticsearch 对多个索引的结果进行排序,以便一个索引具有优先权
- php - 如何使用 Laravel Eloquent 在数据库中保存 JSON 响应,我收到错误“数组到字符串转换”
- java - 对于不使用清单文件的项目,为什么 IntelliJ 会给我与 osgi 相关的警告?
- c# - 为什么 Debug.Log 在这个 for 循环中不起作用?
- javascript - 如何收听 p:chips 中的物品移除事件?
- python - CNTK Python API:加载模型后访问图层
- python - 试图将文本列表转换为小写,但它会将所有内容都转换为 NaN
- sql - 为什么@@ROWCOUNT 变量在 IF 语句后返回零
- python - 为什么这个 RE 不起作用,组功能失败了?