考虑我有一个用
构建的树import networkx as nx
dg = nx.DiGraph()
dg.add_edges_from([('a', 'b'), ('a', 'c'), ('b', 'd'), ('b', 'e')])
我想要一个以下树的间隔表示,我的意思是
[1, [2, [3, 4], [5, 6], 7], [8,9 ], 10]
嵌套对应于树。
networkx或其他库中是否有允许这样做的功能?
答案 0 :(得分:0)
我认为你不会找到这样做的lib。然而,使用DFS很容易。这是一个递归实现:
def tree(dg):
def walk(root, start):
children = dg.successors(root)
if children:
cur = start+1
res = [start]
for c in children:
l = walk(c, cur)
res.append(l)
cur = l[-1]+1
res.append(cur)
return res
else:
return [start, start+1]
roots = [i for i in dg.nodes() if dg.in_degree(i) == 0]
assert(len(roots) == 1)
root = roots[0]
return walk(root, 1)
然后:
>>> tree(dg)
[1, [2, 3], [4, [5, 6], [7, 8], 9], 10]
顺便说一下,你确实注意到我的答案与你的答案不一样。您没有为孩子指定任何顺序。如果您愿意,只需根据所需的顺序对子列表进行排序。