具有多个子节点和下一个节点的树

时间:2011-06-17 07:19:26

标签: c pointers data-structures tree

我想构建一个具有以下特征的树:

  1. 每个节点都可以有1个“下一个节点”。
  2. 每个节点都可以有多个子节点。
  3. 子节点的数量可以从一个节点到另一个节点
  4. 我在想一个看起来像这样的结构:

    struct tree {
      int value;
      struct tree* nextnode;
      struct tree** childnode;
    };
    

    每个节点的子节点数必须参数化。我不知道该怎么做。提前谢谢!

    编辑:让我尝试使用示例来定义它:让我们选择起始节点。现在,我将在编译时定义将有3 NextNodes,并且每个NextNodes将有2 ChildNodes。这是Depth=0。在Depth = 1(即来自Depth=0的每个子节点),我指定将有4个NextNodes,并且对于每个NextNodes,将有3个ChildNodes等等。希望我能够正确地传达它。请问我是否在某处不清楚。

    Edit2 :这是一张图片:

    Here is a pic

3 个答案:

答案 0 :(得分:1)

您可以使用Boost.Graph库。

起初非常复杂,但提供高效的数据存储和高度优化的图算法实现。

来自网站:

算法

BGL算法由一组核心算法模式(实现为通用算法)和一组更大的图算法组成。核心算法模式是

  • 广度优先搜索
  • 深度优先搜索
  • 统一成本搜索

算法模式本身不会在图上计算任何有意义的数量;它们只是用于构建图算法的构建块。 BGL中的图算法目前包括

  • Dijkstra的最短路径
  • Bellman-Ford Shortest Paths
  • 约翰逊的所有最短路径
  • Kruskal的最小生成树
  • Prim的最小生成树
  • 已连接的组件
  • 强连接组件
  • 动态连接组件(使用不相交集)
  • 拓扑排序转置
  • 反向Cuthill Mckee订购
  • 最小的最后顶点排序
  • 顺序顶点着色

数据结构

BGL目前提供两个图表类和一个边缘列表适配器:

  • 的adjacency_list
  • adjacency_matrix
  • edge_list

adjacency_list类是图类的通用“瑞士军刀”。它是高度参数化的,因此可以针对不同情况进行优化:图形是定向的或不定向的,允许或禁止平行边缘,有效访问外边缘或内边缘,快速顶点插入和移除额外空间开销的成本等。

adjacency_matrix类存储| V |中的边x | V |矩阵(其中| V |是顶点数)。该矩阵的元素表示图中的边。邻接矩阵表示特别适用于非常密集的图形,即边缘数接近| V | 2的图形。

edge_list类是一个适配器,它接受任何类型的边缘迭代器并实现边缘列表图。

答案 1 :(得分:0)

这是一棵N树。我建议你拆分树和节点

typedef struct tree tree;
typedef struct node node;

struct tree {
    node * root;
};

struct node {
    int value;
    node * next_node;
};

现在您可以执行树结构的所有操作

这里有一个例子

node * add_child(node *parent, int child_value){
    node * child = malloc(sizeof(node));
    child->value = child_value;
    if(parent->next == NULL)
        parent->next = child;
    else{
        node * temp = parent->next;
        while(temp->next != NULL)
            temp = temp->next;
        temp->next = child;
    }
    return child;
}

答案 2 :(得分:0)

下面是开发具有多个节点的节点的方法。

参考:https://www.geeksforgeeks.org/generic-tree-level-order-traversal/

/* Let us create below tree 
*            10 
*    / / \ \ 
*    2 34 56 100 
*    / \         | / | \ 
*    77 88   1 7 8 9 
*/



 // CPP program to do level order traversal 
 // of a generic tree 

 #include <bits/stdc++.h> 
 using namespace std; 

 // Represents a node of an n-ary tree 

 struct Node 
 { 
   int key; 
   vector<Node *>child; 
 }; 

// Utility function to create a new tree node 

 Node *newNode(int key) 
 { 
    Node *temp = new Node; 
    temp->key = key; 
    return temp; 
 } 


// Driver program 

int main() 
{ 
/* Let us create below tree 
*            10 
*    / / \ \ 
*    2 34 56 100 
*    / \         | / | \ 
*    77 88   1 7 8 9 
*/
Node *root = newNode(10); 
(root->child).push_back(newNode(2)); 
(root->child).push_back(newNode(34)); 
(root->child).push_back(newNode(56)); 
(root->child).push_back(newNode(100)); 
(root->child[0]->child).push_back(newNode(77)); 
(root->child[0]->child).push_back(newNode(88)); 
(root->child[2]->child).push_back(newNode(1)); 
(root->child[3]->child).push_back(newNode(7)); 
(root->child[3]->child).push_back(newNode(8)); 
(root->child[3]->child).push_back(newNode(9)); 


return 0; 
}