Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 树连通无环图表示_C_Data Structures_Graph_Tree - Fatal编程技术网

C 树连通无环图表示

C 树连通无环图表示,c,data-structures,graph,tree,C,Data Structures,Graph,Tree,从 树是一个无向图,其中任意两个顶点通过恰好一条路径连接 路径是由一系列边连接而成的 树-示例: 编写有根的树的多步表示法相对容易 typedef struct multiWalkTreeNode{ struct multiWalkTreeNode * parent; void *item; struct multiWalkTreeNode **childPointer; }Node; typedef struct multiWalkTree{ Node *root; in

树是一个无向图,其中任意两个顶点通过恰好一条路径连接

路径是由一系列边连接而成的

树-示例: 编写有根的树的多步表示法相对容易

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;

问题:

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

(一)

如何表示树(无根)

2) 从维护大型树&better
find()
performance方面来看,一棵树是否有多个表示形式(非根)

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

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


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

表示树的两种基本方法(定向或无向)是作为邻接矩阵或邻接列表。如果它是一棵“密集”树(即,对于一棵有n个节点的树,超过n2条可能边的一半),则将其表示为矩阵更有效。如果它是一棵“稀疏”树(少于可能的n2条边的一半),则邻接列表更有效

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

123456
-------------
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中实现一个二维矩阵或一组值对


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

我们不能考虑节点并编写表示每个节点的
struct
?而不是矩阵?我不太清楚“思考节点并编写
struct
”是什么意思。也许您的意思与二进制搜索树(BST)的实现方式类似:每个节点有一个
struct
,每个边有一个指针。这会遇到一些问题。每个节点都需要数量可变的指针。如果有一个不相交的图,如何访问所有的图?为了找到一个特定的节点,您遍历图的效率如何?我提到的两种方法很简单,并且(如果正确实现的话)允许高效的访问和更新。