【问题标题】:Tree - Connected acyclic graph - Representation树 - 连通无环图 - 表示
【发布时间】:2016-12-14 04:42:54
【问题描述】:

来自wiki

一棵树是一个无向图,其中任意两个顶点都通过一个路径连接。

路径是边的连通序列

树 - 示例:

编写有根树的多步表示相对容易,

typedef struct multiWalkTreeNode{
  struct multiWalkTreeNode * parent;
  void *item;
  struct multiWalkTreeNode **childPointer;
}Node;

typedef struct multiWalkTree{
  Node *root;
  int size; /*Number of nodes in the tree*/
}Tree;

问题:

在树(无根)中,任何节点都没有子/祖先

1)

如何表示一棵树(无根)?

2) 从维持巨大的树和更好的find() 性能方面来看,我们是否有多个表示树(无根)?

【问题讨论】:

    标签: c data-structures graph tree


    【解决方案1】:

    1) 无需分别跟踪childparent 链接,只需将parent 指针添加到child 并使用child 作为相邻顶点的完整列表。从实际的角度来看,您必须维护指向某个顶点的指针作为find() 的入口点,否则任何一个节点都不会有任何特别之处。

    2) 树导航最常用的两种方法是深度优先搜索和广度优先搜索。通常,Breadth 在递归调用子节点之前检查是否有任何子节点是请求的节点。深度检查自身,然后对子节点执行递归调用,直到到达叶子节点。 从内存的角度来看,这些都不是特别有效,但它们很容易编写。

    您可以从任何节点开始搜索树,搜索时间会有很大差异,但我不会将其称为同一棵树的不同表示。

    【讨论】:

      【解决方案2】:

      表示树(有向或无向)的两种基本方式是邻接矩阵邻接列表。如果它是一棵“密集”树(即具有 n 个节点的树的 n2 个可能边的一半以上),那么它是将其表示为矩阵更有效。如果它是一个“稀疏”树(少于可能的 n2 条边的一半),那么邻接表的效率更高。

      您的示例树,表示为 邻接矩阵 将类似于:(请原谅 ASCII 艺术)

           1 2 3 4 5 6
          -------------
       1:  0 0 0 1 0 0
       2:  0 0 0 1 0 0
       3:  0 0 0 1 0 0
       4:  1 1 1 0 1 0
       5:  0 0 0 1 0 1
       6:  0 0 0 0 1 0
      

      每个索引(水平和垂直)对应一个节点,如果该行的节点与该列的节点有边,则将 1 放置在矩阵中,如果没有,则将 0边缘。例如,节点 3 和 4 之间有一条边,所以在矩阵中,位置 (3,4) 有一个1。 (别忘了,在 C 中,数组索引当然是从 0 开始的。我从 1 开始,因为那是最低节点的标签,这只是一个例子。)

      这是一个对称矩阵,因为它是一个无向图。您可以通过使用行索引作为边的源,将列作为边的目的地来实现有向图。另一种扩展是通过使用矩阵中的值作为边的权重来制作一个加权有向图,而不仅仅是一个1

      但请注意,这对您的图表来说是多么低效。对于具有 n 个节点的图,您需要一个 n×n 矩阵(就空间而言,n2 乘以存储一个值的大小)。无论如何,大部分空间都是空的(0)。

      另一种基本方法是邻接列表,就是:相邻节点的列表---边列表。您的图表的邻接列表可能是:

         1,4
         2,4
         3,4
         4,5
         5,6
      

      只要您知道这是一个无向图,您就可以只记录 1,4 并知道这相当于 4,1。当然,对于有向图,您可以说 1,4 仅表示“从 1 到 4”。请注意,使用邻接表表示必须存储的信息量取决于 的数量,而不是像矩阵表示那样的 节点 的数量。

      我会让你弄清楚如何在 C 中实现二维矩阵或值对列表。

      注意,邻接矩阵和邻接列表都只表示节点之间的。您可能还希望在每个节点 in 中存储一些数据。这将需要一个单独的结构,例如列表或数组。

      【讨论】:

      • 我们不能考虑节点并写struct 代表每个节点吗?而不是矩阵?
      • 我不太确定“考虑节点并编写struct”是什么意思。也许您的意思类似于二叉搜索树 (BST) 的实现方式:每个节点都有一个 struct,每个边都有一个指针。这会遇到一些问题。每个节点都需要可变数量的指针。如果你有一个不相交的图,你怎么能访问所有的图?为了找到一个特定的节点,您遍历图形的效率如何?我提到的两种方法都很简单,并且(如果实施得当)允许有效的访问和更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多