python中的树区间表示

python中的树区间表示,python,tree,networkx,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或其他库中是否有允许这样做的函数?我认为您不会找到这样做的库。不过,使用DFS很容易。下面是一个递归实现:

假设我有一棵树是用

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或其他库中是否有允许这样做的函数?

我认为您不会找到这样做的库。不过,使用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)
然后:


顺便说一句,你注意到我的答案和你的不一样。您没有对孩子们指定任何顺序。如果需要,只需按照所需的顺序对子列表进行排序。

如何确定根?你是随机选取的吗?这是一个有序的树,所以根是minSorry我错过了有向图,谢谢,我需要它将每个节点表示为一对,例如a=(1,10),b=(2,7),你认为不经过这个中间步骤更直接吗?不确定你的意思。使用相同的方法,您可以返回字典
'a':(1,10)
,而不是像我那样附加到列表中。很抱歉,我没有很好地阅读代码,事实上,添加几行就足够了dg.node[root]['born\u right']=cur dg.node[root]['born\u left']=start dg.node[root]['born\u right']=start+1
>>> tree(dg)
[1, [2, 3], [4, [5, 6], [7, 8], 9], 10]