python中的树间隔表示

时间:2014-02-04 11:39:10

标签: python tree networkx

考虑我有一个用

构建的树
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或其他库中是否有允许这样做的功能?

1 个答案:

答案 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]

顺便说一下,你确实注意到我的答案与你的答案不一样。您没有为孩子指定任何顺序。如果您愿意,只需根据所需的顺序对子列表进行排序。