簡體   English   中英

將二叉樹轉換為相應的無向圖

[英]Convert a binary tree to corresponding undirected graph

給定二叉樹的表示形式,該樹最多可以包含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之類的算法從圖中獲得一棵樹。

問題:是否有一種從二叉樹創建圖形的算法? 例如,如果以有序方式遍歷二叉樹,那么如何從中創建無向圖?

我對您了解順序遍歷感到有些驚訝,但無法自行解決。 我給你一個基本的輪廓:

我假設tree_node中的info成員是節點ID。

您必須執行以下操作:

1)初始化您的數據結構,即為所有i,j設置adjacency_m[i][j] = 0 0 <= i < n0 <= j < n

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

 }

編輯:通過評論中的討論可以看到,您的問題並不十分清楚。 您應該在樹的抽象,數學概念和用於表示它們的圖形和數據結構之間進行區分。 正確地說,BFS,Kruskal和Prim可用於計算圖的生成樹。 正如注釋中所討論的,根據定義,任何樹都是圖。 圖通常用鄰接矩陣表示,而二叉樹通常用遞歸樹結構表示。 請注意,您也可以用鄰接矩陣來表示一棵二叉樹(如果需要,可以用不同的鄰接值(例如1和2)對“ left”和“ right”子信息進行編碼)以及具有這種遞歸的圖樹狀結構(盡管對於一般圖形,您必須允許兩個以上的出線邊)。 在您的問題中,您正在詢問將二叉樹的表示形式從樹狀遞歸結構轉換為鄰接矩陣。

假設您已經實現了圖結構和向圖的邊緣添加函數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添加一條邊。 您還應該添加一個向節點添加信息的功能,但是我的代碼被認為是必需的最低工作量,而有趣的部分留給您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM