我想构建一个具有以下特征的树:
我在想一个看起来像这样的结构:
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 :这是一张图片:
答案 0 :(得分:1)
您可以使用Boost.Graph库。
起初非常复杂,但提供高效的数据存储和高度优化的图算法实现。
来自网站:
BGL算法由一组核心算法模式(实现为通用算法)和一组更大的图算法组成。核心算法模式是
算法模式本身不会在图上计算任何有意义的数量;它们只是用于构建图算法的构建块。 BGL中的图算法目前包括
BGL目前提供两个图表类和一个边缘列表适配器:
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;
}