Algorithm 确定有向图或无向图是否为树
我想知道一种快速算法来确定有向图或无向图是树 波斯特似乎在处理它,但它不是很清楚;根据这个链接,如果图是非循环的,那么它就是一棵树。但是如果你考虑下面的有向图和无向图:在我看来,只有图1和图4是树。我想3既不是循环的,也不是树 有向图或无向图是否是树,需要以有效的方式检查哪些内容?向前走一步:如果一棵树存在,那么它是不是一棵二叉树?对于有向图:Algorithm 确定有向图或无向图是否为树,algorithm,graph,tree,cyclic,Algorithm,Graph,Tree,Cyclic,我想知道一种快速算法来确定有向图或无向图是树 波斯特似乎在处理它,但它不是很清楚;根据这个链接,如果图是非循环的,那么它就是一棵树。但是如果你考虑下面的有向图和无向图:在我看来,只有图1和图4是树。我想3既不是循环的,也不是树 有向图或无向图是否是树,需要以有效的方式检查哪些内容?向前走一步:如果一棵树存在,那么它是不是一棵二叉树?对于有向图: 查找没有传入边的顶点(如果有多个或没有这样的顶点,则失败) 从该顶点执行或。如果遇到已访问的顶点,则该顶点不是树 如果您完成了,并且存在未探测的顶点
- 查找没有传入边的顶点(如果有多个或没有这样的顶点,则失败)
- 从该顶点执行或。如果遇到已访问的顶点,则该顶点不是树
- 如果您完成了,并且存在未探测的顶点,则它不是一棵树-图形没有连接
- 否则,它就是一棵树
- 若要检查二叉树,请另外检查每个顶点是否最多有2条输出边
- 通过简单的深度优先搜索(从任何顶点开始)检查循环-如果有循环,它不是树
- 如果上面的过程留下一些未探测的顶点,则它不是一棵树,因为它没有连接
- 否则,它就是一棵树
- 要检查二叉树,如果图形有多个顶点,请另外检查所有顶点是否有1-3条边(1条到父级,2条到子级) 检查根(即一个顶点是否包含1-2条边)是不必要的,因为在非循环连接的无向图中必须存在具有1-2条边的顶点 请注意,通常不可能识别根(在特殊情况下可能),因为在许多无向图中,如果我们将其设置为二叉树,则可以将多个节点设置为根
- 图是连通的
- 边的数量等于节点的数量-1
- 该图是连通图
- 图表没有循环 当以下三个条件为真时,有向图是树:
- 该图是连通图
- 图表没有循环
- 除根节点外,每个节点都应有一个父节点
- 当以下两个条件为真时,无向图是树:
请注意,链接问题只处理无向性的情况。我的理解是你想处理这个案子?在直接案例中,还有其他案例需要担心(关于点1,是
A->B:我可以在顶点类中有一个私有的OutgoingEdge
数组字段,这样当每个边被添加到图形中时,我可以更新这个字段。对于每个顶点,我检查这个数组长度是否大于1。如果是,它不是树。关于点2:这只是循环检测,对吗?有什么具体的原因吗关于第3点:我可以从我的outgoingEdge
数组字段中获取此信息,如果它的长度如您所述,那么在无向无环连接图中检查根不是必需的,因为可能有多个节点可以作为根?#1
是有意义的,这通常是工作方式,它主要用于图形实现。#2
是的,我相信您也可以使用DFS,没有特别的理由选择BFS。#3
是的。是的,在许多情况下,多个节点可以充当根节点。