C 将二叉树转换为相应的无向图
给定一个二叉树的表示,该二叉树最多可以有n个节点: 从二叉树构造一个无向图,该二叉树最多可以有n个节点 图形表示为结构: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
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);
}
}