Python NetworkX查找有向图中特定节点的根节点
假设我在网络X中有一个有向图G,这样:Python NetworkX查找有向图中特定节点的根节点,python,graph-theory,networkx,Python,Graph Theory,Networkx,假设我在网络X中有一个有向图G,这样: G中有多棵树 G中的每个节点N正好有1或0 父母的 对于一个特定的节点N1,我想找到它所在的树的根节点(其度为0的祖先)。在NetworkX中有没有一种简单的方法可以做到这一点 我看了看: 但在我的图中有多个根节点。只有一个根节点恰好与N1位于同一个树中。编辑2017年11月。请注意,这是在networkx 2.0发布之前编写的。有一种方法可以将1.x代码更新为2.0代码(特别是使其与两者兼容) 这里有一个简单的递归算法。它假定最多有一个单亲。如果某个对
但在我的图中有多个根节点。只有一个根节点恰好与N1位于同一个树中。编辑2017年11月。请注意,这是在networkx 2.0发布之前编写的。有一种方法可以将1.x代码更新为2.0代码(特别是使其与两者兼容)
这里有一个简单的递归算法。它假定最多有一个单亲。如果某个对象没有父对象,那么它就是根对象。否则,它将返回其父级的根
def find_root(G,node):
if G.predecessors(node): #True if there is a predecessor, False otherwise
root = find_root(G,G.predecessors(node)[0])
else:
root = node
return root
如果该图是一个有向无环图,它仍然会找到一个根,尽管它可能不是唯一的根,甚至不是给定节点的唯一根祖先。我冒昧地更新了@Joel的脚本。他原来的职位不适合我
def find_root(G,child):
parent = list(G.predecessors(child))
if len(parent) == 0:
print(f"found root: {child}")
return child
else:
return find_root(G, parent[0])
这里有一个测试:
G = nx.DiGraph(data = [('glu', 'skin'), ('glu', 'bmi'), ('glu', 'bp'), ('glu', 'age'), ('npreg', 'glu')])
test = find_root(G, "age")
age
glu
npreg
found root: npreg
你有没有想过只看它的父母,然后是父母的父母等等,直到它停止i、 例如,对边缘进行深度优先搜索(或广度优先搜索或任何其他搜索),直到停止?最后一个节点必须是它。