【问题标题】:Determining whether or not a directed or undirected graph is a tree确定有向图或无向图是否为树
【发布时间】:2013-12-13 00:08:18
【问题描述】:

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

Thispost 好像有处理,但不是很清楚;根据这个链接,如果图是无环的,那么它就是一棵树。但是,如果您考虑下面的有向图和无向图:在我看来,只有图 1 和图 4 是树。我想 3 既不是循环的,也不是树。

需要以有效的方式检查有向图或无向图是否是树?并提前一步:如果一棵树存在,那么它是否是二叉树?

【问题讨论】:

  • 快速说明,链接的问题确实只处理无向案例。我的理解是你想处理定向案件?在有向的情况下,还有其他情况需要担心(A -> B <- C 是一棵树吗?)。

标签: algorithm graph tree


【解决方案1】:

对于有向图:

  • 找到没有传入边的顶点(如果有多个或没有这样的顶点,则失败)。

  • 从该顶点执行breadth-firstdepth-first search。如果你遇到一个已经访问过的顶点,那它就不是一棵树。

  • 如果您已完成并且有未探索的顶点,则它不是一棵树 - 图未连接。

  • 否则就是一棵树。

  • 要检查二叉树,还要检查每个顶点是否最多有 2 条出边。

对于无向图:

  • 使用简单的深度优先搜索(从任何顶点开始)检查循环 - "If an unexplored edge leads to a node visited before, then the graph contains a cycle." 如果存在循环,则它不是树。

  • 如果上述过程留下一些未探索的顶点,则它不是一棵树,因为它没有连接。

  • 否则就是一棵树。

  • 要检查二叉树,如果图有多个顶点,另外检查所有顶点是否有 1-3 条边(1 条到父节点,2 条到子节点)。

    检查根,即一个顶点是否包含 1-2 条边,是没有必要的,因为在无环连通无向图中必须有具有 1-2 条边的顶点。

    请注意,一般情况下无法识别根(在特殊情况下可能),因为在许多无向图中,如果我们要将其设为二叉树,则可以将多个节点设为根。

【讨论】:

  • 关于第 1 点:我可以在 Vertex 类中有一个私有的 OutgoingEdge 数组字段,这样当每条边添加到图形时,我可以更新这个字段。对于每个顶点,我检查这个数组长度是否> 1。如果是,它不是一棵树..
  • 关于第 2 点:这不过是循环检测吧? BFS over DFS 的任何具体原因
  • 关于第 3 点:如果长度为 ,我可以从我的 outgoingEdge 数组字段中获取此信息
  • 正如您提到的,检查无向无环连通图中的根不是必需的,因为可能有多个节点可以充当根?
  • #1 有道理,这通常是adjacency lists 的工作方式,主要用于图形实现。 #2是的,我相信你也可以使用DFS,没有特别的理由选择BFS。 #3 是的。是的,在许多情况下,多个节点可以充当根。
【解决方案2】:

如果给定的无向图是一棵树:

  • 图是连通的
  • 边数等于节点数 - 1。

【讨论】:

    【解决方案3】:

    当满足以下两个条件时,无向图是一棵树:

    1. 该图是一个连通图。
    2. 图表没有循环。

    当满足以下三个条件时,有向图是一棵树:

    1. 该图是一个连通图。
    2. 图表没有循环。
    3. 除根以外的每个节点都应该有一个父节点。

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      相关资源
      最近更新 更多