是否存在一个算法(或一系列算法),可以在没有父节点、叶节点和子节点的概念,只有邻居关系的情况下找到给定通用图结构 G=(V,E)
:
1)确定 G
是否是一棵树(仅检查 |V| = |E|+1
是否足够吗?)
2)如果该图实际上是一棵树,则确定其叶节点和中心节点(即使树深度最小的节点)。
谢谢
是否存在一个算法(或一系列算法),可以在没有父节点、叶节点和子节点的概念,只有邻居关系的情况下找到给定通用图结构 G=(V,E)
:
1)确定 G
是否是一棵树(仅检查 |V| = |E|+1
是否足够吗?)
2)如果该图实际上是一棵树,则确定其叶节点和中心节点(即使树深度最小的节点)。
谢谢
d[] = degrees of all nodes
que = { leaves, i.e i that d[i]==1}
while len(que) > 1:
i=que.pop_front
d[i]--
for j in neighbors[i]:
if d[j] > 0:
d[j]--
if d[j] == 1 :
que.push_back(j)
最后一个在队列中的节点是中心节点。
你可以通过考虑直径路径来证明这一点。 为了简化,我们假设直径路径长度为奇数,因此路径的中间节点是唯一的,我们称该节点为M,
我们可以看到:
不,这还不够——一棵树是一个连通图,它有 n-1
条边。在一个非连通图中可能有 n-1
条边,但它不是一棵树。
你可以运行 BFS 查找图是否连通,然后计算边的数量,这将为您提供足够的信息以确定该图是否为一棵树。
叶子节点是具有节点度数 d(v) = 1
的节点 v
(只与一个相邻顶点相连接)。
(1) 此答案假定为非定向图。
(2) 在此,n
表示顶点的数量。