python中一棵树的最长路径

时间:2019-01-27 15:58:00

标签: python algorithm data-structures

所以,我有一本树形结构的字典。好吧,不完全是树。但是,我必须找到这棵树的最长路径。

这是字典:

{'1:0': [], '1:1': ['2:1', '1:0'], '1:2': ['1:3', '2:2', '1:1'], '1:3': [], '0:1': ['0:2', '1:1', '0:0'], '0:0': ['1:0'], '0:3': [], '0:2': ['0:3'], '2:3': ['2:2'], '2:2': ['3:2'], '2:1': ['2:2'], '2:0': ['2:1'], '3:2': [], '3:3': ['3:2'], '3:0': [], '3:1': ['3:2']}

实际上可能有很多根源。例如,在键1:1中,它有两个子节点,其中一个是死端(1:0)。然后2:1有一个孩子2:2。另外,1:11:2

的子级

如何在python中编写此代码以遍历并找到最长的路径?

2 个答案:

答案 0 :(得分:3)

您可以使用广度优先搜索的递归版本:

_d = {'1:0': [], '1:1': ['2:1', '1:0'], '1:2': ['1:3', '2:2', '1:1'], '1:3': [], '0:1': ['0:2', '1:1', '0:0'], '0:0': ['1:0'], '0:3': [], '0:2': ['0:3'], '2:3': ['2:2'], '2:2': ['3:2'], '2:1': ['2:2'], '2:0': ['2:1'], '3:2': [], '3:3': ['3:2'], '3:0': [], '3:1': ['3:2']}
def paths(d, _start, _current = []):
  if _current:
    yield _current
  for i in d[_start]:
     if i not in _current:
        yield from paths(d, i, _current+[i])

results = [c for i in _d for c in paths(_d, i, [i])]
_max_len = max(map(len, results))
_paths = [i for i in results if len(i) == _max_len]

输出:

[['1:2', '1:1', '2:1', '2:2', '3:2'], ['0:1', '1:1', '2:1', '2:2', '3:2']]

答案 1 :(得分:1)

您应该考虑使用其他结构来保存此数据,这本质上是一个图形问题。 python带有一个非常有用的networkx库,用于图形。
您可以使用dag_longest_path在有向图中找到最长的路径。

semi_tree = {'1:0': [], '1:1': ['2:1', '1:0'], '1:2': ['1:3', '2:2', '1:1'], '1:3': [], '0:1': ['0:2', '1:1', '0:0'], '0:0': ['1:0'], '0:3': [], '0:2': ['0:3'], '2:3': ['2:2'], '2:2': ['3:2'], '2:1': ['2:2'], '2:0': ['2:1'], '3:2': [], '3:3': ['3:2'], '3:0': [], '3:1': ['3:2']}
import networkx as nx
my_graph = nx.DiGraph(semi_tree)
result = nx.dag_longest_path(my_graph)
print(result) #Output: ['1:2', '1:1', '2:1', '2:2', '3:2']