[英]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;
我們可以使用Prim , Kruskal或DFS之類的算法從圖中獲得一棵樹。
問題:是否有一種從二叉樹創建圖形的算法? 例如,如果以有序方式遍歷二叉樹,那么如何從中創建無向圖?
我對您了解順序遍歷感到有些驚訝,但無法自行解決。 我給你一個基本的輪廓:
我假設tree_node
中的info
成員是節點ID。
您必須執行以下操作:
1)初始化您的數據結構,即為所有i,j
設置adjacency_m[i][j] = 0
0 <= i < n
, 0 <= 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
函數應在圖形中從a
到b
添加一條邊。 您還應該添加一個向節點添加信息的功能,但是我的代碼被認為是必需的最低工作量,而有趣的部分留給您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.