Algorithm 确定有向图或无向图是否为树

Algorithm 确定有向图或无向图是否为树,algorithm,graph,tree,cyclic,Algorithm,Graph,Tree,Cyclic,我想知道一种快速算法来确定有向图或无向图是树 波斯特似乎在处理它,但它不是很清楚;根据这个链接,如果图是非循环的,那么它就是一棵树。但是如果你考虑下面的有向图和无向图:在我看来,只有图1和图4是树。我想3既不是循环的,也不是树 有向图或无向图是否是树,需要以有效的方式检查哪些内容?向前走一步:如果一棵树存在,那么它是不是一棵二叉树?对于有向图: 查找没有传入边的顶点(如果有多个或没有这样的顶点,则失败) 从该顶点执行或。如果遇到已访问的顶点,则该顶点不是树 如果您完成了,并且存在未探测的顶点

我想知道一种快速算法来确定有向图或无向图是树

波斯特似乎在处理它,但它不是很清楚;根据这个链接,如果图是非循环的,那么它就是一棵树。但是如果你考虑下面的有向图和无向图:在我看来,只有图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
      是的。是的,在许多情况下,多个节点可以充当根节点。