【问题标题】:Convert a binary tree to corresponding undirected graph将二叉树转换为对应的无向图
【发布时间】:2017-01-13 12:08:16
【问题描述】:

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

typedef struct node
{
  int info,n;
  struct node *left,*right;
}tree_node;

从最多有 n 个节点的二叉树构造一个无向图。

图形表示为结构:

typedef struct
{
  int n;
  tree_node *nodes[];
  int adjacency_m[][];
}graph;

我们可以使用 PrimKruskalDFS 等算法从图中得到一棵树。

问题:有没有一种算法可以从二叉树创建图? 例如,如果以 In-order 方式遍历二叉树,那么如何从中创建无向图?

【问题讨论】:

  • 无论如何都不是先验结果图。
  • 据我所知 - 树就是图。
  • @ufo 树是抽象级别的图。您的区别在于使用的具体数据结构,但您没有提供目标图数据结构。您可以通过任何方式完全遍历树,将树结构转换为图结构,但效率取决于所涉及的实际数据结构。
  • @ufo 树是一个有向无环图,其特点是有一个根节点,并且从根节点到叶节点的每条路径都是唯一的。您已经有了邻接信息,它们在您的代码中分别称为 leftright:它们是节点可能的 2 个传出边。
  • 每棵树都是一个图(但不是每一个图都是一棵树)。只需制作树的副本,您就会得到一个图表。

标签: c algorithm binary-tree undirected-graph


【解决方案1】:

我有点惊讶你知道中序遍历,但不能靠你自己解决这个问题。我给你一个基本的大纲:

我假设您的tree_node 中的info 成员是节点ID。

您必须执行以下操作:

1) 初始化你的数据结构,即为所有i,j0 <= i < n0 <= j < n设置adjacency_m[i][j] = 0

2) 在你的中序遍历中,当你访问一个节点时:

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);
     }

 }

编辑:正如您在 cmets 中的讨论所见,您的问题并不是很清楚。您应该区分树的抽象数学概念和用于表示它们的图形和数据结构。正如您所说的那样,BFS、Kruskal 和 Prim 可用于计算图的生成树。正如 cmets 中所讨论的,任何树都是定义的图。图通常用邻接矩阵表示,而二叉树通常用递归树结构表示。请注意,您也可以用邻接矩阵表示二叉树(如有必要,您可以使用不同的邻接值对“左”和“右”子信息进行编码,例如 1 和 2),以及具有这种递归的图树状结构(尽管对于一般图形,您必须允许两个以上的出边)。在您的问题中,您问的是如何将二叉树的表示从树状递归结构转换为邻接矩阵。

【讨论】:

  • 第二个if语句最后一行不应该是“tree_to_graph(node->right)”吗?
【解决方案2】:

假设您已经实现了一个图形结构和一个用于向图形添加边的函数void add(int 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 函数应该在图形中添加一条从 ab 的边。您还应该添加一个向节点添加信息的函数,但我的代码应该是必要的工作最低限度,把有趣的部分留给您。

【讨论】:

  • 点了。我还是有点困,我的咖啡杯还只有半空,所以我完全错过了。
  • 它在某个地方,因此可以通过add 函数访问。
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 2020-08-24
  • 2021-06-07
  • 2015-09-24
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多