Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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_Algorithm_Binary Tree_Undirected Graph - Fatal编程技术网

C 将二叉树转换为相应的无向图

C 将二叉树转换为相应的无向图,c,algorithm,binary-tree,undirected-graph,C,Algorithm,Binary Tree,Undirected Graph,给定一个二叉树的表示,该二叉树最多可以有n个节点: 从二叉树构造一个无向图,该二叉树最多可以有n个节点 图形表示为结构: typedef struct { int n; tree_node *nodes[]; int adjacency_m[][]; }graph; 我们可以使用Prim、Kruskal或DFS等算法从图中得到一棵树 问:有没有一种算法可以从二叉树创建一个图? 例如,如果按顺序遍历二叉树,那么如何从中创建无向图 假设您已经实现了一个图形结构和一个函数,用于向图形vo

给定一个二叉树的表示,该二叉树最多可以有n个节点:

从二叉树构造一个无向图,该二叉树最多可以有n个节点

图形表示为结构:

typedef struct
{
  int n;
  tree_node *nodes[];
  int adjacency_m[][];
}graph;
我们可以使用Prim、Kruskal或DFS等算法从图中得到一棵树

问:有没有一种算法可以从二叉树创建一个图?
例如,如果按顺序遍历二叉树,那么如何从中创建无向图

假设您已经实现了一个图形结构和一个函数,用于向图形void addint a,int b添加边,我将用C方式解决您的问题。此外,为了简洁起见,我假设你有一个静态的全局变量,它至少有一些节点深,我跳过了角点的情况,这对你来说更有趣

void tree_to_graph(tree_node *node) {
    if (node->left != NULL) {
        add(n, node->left->n);
        tree_to_graph(node->left);
    }
    if (node->right != NULL) {
        add(n, node->right->n);
        tree_to_graph(node->right);
    }
}

角点情况是当图形不够深时。你应该实施这个案例。add函数应该在图形中添加从a到b的边。您还应该添加一个向节点添加信息的函数,但我的代码应该是必要的最小工作时间,将有趣的部分留给您。

我有点惊讶,您知道顺序遍历,但无法自己解决这个问题。我会给你一个基本的提纲:

我假设树节点中的info成员是节点id

您必须执行以下操作:


1初始化数据结构,即为所有i,j,0设置邻接度_m[i][j]=0。无论如何,树不是从生成的图形开始的。就我所知,树是一个图形。@ufo树是抽象级别的图形。您的区别在于所使用的具体数据结构,但您没有提供目标图形数据结构。通过以任何方式完全遍历树,可以将树结构转换为图结构,但效率取决于所涉及的实际数据结构。@ufo树是一个有向无环图,其特点是具有根节点,并且从根节点到叶节点的每条路径都是唯一的。您已经有了邻接信息,它们在代码中分别被称为left和right:这是节点可能的两条传出边。每个树都是一个图,但不是每个图都是一个树。只要把这棵树复制一份,你就会得到一张图表。点被取下。我还是有点困,我的咖啡杯还是半空的,所以我完全错过了。它在某个地方,可以通过add函数访问。在第二个if语句中,最后一行不是应该是tree\u to\u graphnode->right吗?
void tree_to_graph(tree_node *node) {
    if (node->left != NULL) {
        add(n, node->left->n);
        tree_to_graph(node->left);
    }
    if (node->right != NULL) {
        add(n, node->right->n);
        tree_to_graph(node->right);
    }
}
tree_to_graph(tree_node *node) {
     // add a pointer to the node
     graph->nodes[node->info] = node;

     if(node->left) {
          // if node has a left child, , add adjecancy matrix entries for edges from node -> left, and left -> node
          graph->adjacency_m[node->info][node->left->info] = 1;
          graph->adjacency_m[node->left->info][node->info] = 1;
          tree_to_graph(node->left);
     }
     if(node->right) {
          // if node has a right child, add adjecancy matrix entries for edges from node -> right, and right-> node
          graph->adjacency_m[node->info][node->right->info] = 1;
          graph->adjacency_m[node->right->info][node->info] = 1;
          tree_to_graph(node->right);
     }

 }