您创建了一个动态容器 - 例如。一个,它是在运行时构建的。在这种结构的情况下,您必须动态分配它们并使用指针来引用它们。那是:
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;
}