Создан динамический контейнер - например. тот, который построен во время выполнения. В случае таких структур вы должны распределять их динамически и использовать указатель, чтобы ссылаться на них. То есть:
MyBinaryTree * BuildSimpleTree()
{
BinaryTree<int> * node1 = new BinaryTree(0, nullptr, nullptr);
BinaryTree<int> * node2 = new BinaryTree(0, nullptr, nullptr);
return new MyBinaryTree<int>(0, node1, node 2);
}
MyBinaryTree * tree = BuildSimpleTree();
Причиной требования динамического распределения является то, что все локальные статически выделенные объекты (например, находящиеся на стеке вместо кучи.) Автоматически уничтожаются, когда вы выходите из функции или метода. Однако, чтобы дерево работало правильно, все его дети (и рекурсивно их дети) остаются живыми после возвращения из функции, поэтому их нужно распределять динамически.
Вы должны помнить, хотя бесплатно все экземпляров выделенных классов. Это можно сделать вручную или автоматически, рекурсивно - в BinaryTree и MyBinaryTree dtors.
Если вы можете скомпилировать код, используя C++ 11, всегда есть возможность использовать перемещение семантику - вы сможете вернуть дерево по значению и сохранить код быстро и эффективно использует память в то же время. Это решение будет выглядеть следующим образом:
template <class T>
struct MyBinaryTree
{
T val;
BinaryTree<T>* left;
BinaryTree<T>* right;
BinaryTree<T>(T v, BinaryTree<T>* l, BinaryTree<T>* r)
: val(v), left(l), right(r)
{
}
BinaryTree<T>(BinaryTree<T> && r)
{
val = r.val;
left = r.left;
right = r.right;
}
};
Затем вы можете вернуть свое дерево по значению (но по-прежнему строит узлы динамически):
MyBinaryTree BuildTree()
{
auto left = new BinaryTree<int>(0, nullptr, nullptr);
auto right = new BinaryTree<int>(0, nullptr, nullptr);
MyBinaryTree<int> result(0, left, right);
return result;
}
Это то, что для 'нового' оператора. – icktoofay
Просто убедитесь, что бинарное дерево управляет всеми его ресурсами и предоставляет подходящий конструктор копирования, оператор присваивания, деструктор и т. Д. – juanchopanza
реализация списка ссылок будет лучше, с распределением динамической памяти –