Я пишу программу на C ++, которая использует генетические методы для оптимизации дерева выражений.
Я пытаюсь написать класс Tree
, который имеет в качестве члена данных Node root
. Конструктор узлов генерирует случайное дерево узлов с +
, -
, *
, /
в качестве узлов и целыми числами в виде листьев.
Я работал над этим некоторое время, и я еще не определился с лучшей структурой. Поскольку мне нужно получить доступ к любому узлу в дереве, чтобы мутировать или скрестить дерево, мне нужно сохранить филион Узлов. Массив подойдет, но кажется, что вектор является рекомендуемым контейнером.
vector<Node> dict;
Таким образом, класс Tree будет содержать вектор dict
со всеми узлами дерева (или указателями на него), корневой узел дерева и переменную для хранения пригодной меры для дерева.
class Tree
{
public:
typedef vector<Node>dict;
dict v;
Node *root;
float fitness;
Tree(void);
~Tree();
};
class Node
{
public:
char *cargo;
Node *parent;
Node *left;
Node *right;
bool entry;
dict v;
Node(bool entry, int a_depth, dict v, Node *pparent = 0);
};
Tree::Tree()
{
Node root(true, tree_depth, v);
};
Кажется, нет хорошего места, чтобы поставить typedef vector<Node>dict;
, потому что, если он идет в определении Tree, он не знает о Node и выдаст ошибку, говоря так. Я не смог найти место для typedef
.
Но я даже не уверен, что вектор - лучший контейнер. Узлы просто должны быть последовательно проиндексированы. Контейнер должен будет расти, так как может быть от 200 до 500 узлов.