使用NetworkX的子树

4
在networkX中,我有一棵树作为DiGraph()。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import networkx as nx
t = nx.DiGraph()
t.add_edge(1,'r')
t.add_edge(2,'r')
t.add_edge(3,'r')
t.add_edge(4,2)
t.add_edge(5,2)
t.add_edge(6,5)
print t.edges() 

如果我选择树的节点2。
如何获取节点2的子树?

编辑

我期望得到这个子树。

[(4,2),(5,2),(6,5)]

你能更具体地解释一下在有向树中“2的子树”是什么意思吗? - Aric
1个回答

12
如果你的意思是以节点2为根的子树,那么就是这样。
from networkx.algorithms.traversal.depth_first_search import dfs_tree

subtree_at_2 = dfs_tree(t, 2)

编辑: 看起来你在边的节点顺序上有些混淆了。在一棵有向树中,所有路径都从根节点到叶子节点,而不是相反方向。dfs_tree(t.reverse(), 2) 可以给你想要的树形结构,但请修改你的代码。


使用这个代码,我得到的是[(2,'r')],而不是一个子树。 - JuanPablo
@JuanPablo:这绝对是你图中以2为根的子树。你已经颠倒了边缘。 - Fred Foo
在一棵无向树中,我如何使用dfs_tree? - JuanPablo
@JuanPablo:在无向树中,以节点为根的唯一子树的概念就消失了,无法实现。(仍然存在子树,但每个节点没有唯一的子树。)你仍然可以应用 dfs_tree,但它会给出一个包含所有节点的有向树,并以你提供的节点作为根节点。例如尝试 nx.draw(dfs_tree(t.to_undirected(), 2)) - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接