我想知道一种确定有向图或无向图是一棵树的快速算法。
这篇文章似乎处理了它,但是它不是很清楚。根据此链接,如果图是非循环的,则它是一棵树。但是,如果您考虑以下有向图和无向图:在我看来,只有图1和图4是树。我想3既不是循环的,也不是树。
需要以有效方式检查什么以查看有向图或无向图是否是树?并向前迈出一步:如果有一棵树存在,那么它是否是二叉树?
对于有向图:
查找没有输入边的顶点(如果存在多个顶点或不存在,则失败)。
从该顶点进行广度优先或深度优先搜索。如果遇到已经访问过的顶点,则不是树。
如果您完成了操作,并且有未开发的顶点,则它不是一棵树-图形未连接。
否则,它是一棵树。
要检查二叉树,请另外检查每个顶点是否最多具有2个输出边。
对于无向图:
通过简单的深度优先搜索(从任何顶点开始)检查循环- “如果未探索的边导致之前访问过的节点,则图形包含一个循环。” 如果有一个循环,那不是一棵树。
如果上述过程使一些顶点无法利用,则它不是树,因为它没有连接。
要检查一棵二叉树,如果图形具有多个顶点,请另外检查所有顶点具有1-3个边(父边1个,子边2个)。
检查根,即,一个顶点是否包含1-2的边缘,是没有必要的,因为 必须 是顶点与无环1-2的边连接无向图。
注意,一般情况下不可能识别根(在特殊情况下可能是可能的),因为在许多无向图中,如果要使它成为二叉树,则可以将多个节点作为根。