c++ - 如何在 C++ 函数中构造二叉树并返回它?

标签 c++

我用C++制作了一个简单的二叉树结构:

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) {}
};

我想编写一个函数来创建二叉树并返回它。不幸的是,这个结构包含指针。因此,如果我在堆栈上返回二叉树,则指针将变得无关紧要。

有没有办法返回二叉树结构?

最佳答案

正如其他人所指出的,您将需要利用动态分配。使用时new ,您通常需要遵守 Rule of Three, Four, or Five 。这意味着您需要决定销毁、复制构造、分配、移动构造和移动分配的行为方式并实现它们。通常对于容器,您需要深层复制语义。即使您使用智能指针使销毁变得简单,您也需要做更多的事情来使拷贝更深。

但是,并不一定需要涉及 new应用动态内存分配。例如,您可以使用 list<>代表leftright相反,这样做会自动为您提供深层复制语义:

template <typename T>
class MyBinaryTree {
    T val_;
    std::list< MyBinaryTree<T> > left_;
    std::list< MyBinaryTree<T> > right_;

    template <typename U>
    friend MyBinaryTree<U> MakeMyBinaryTree (U v,
                                             MyBinaryTree<U> *l = 0,
                                             MyBinaryTree<U> *r = 0) {
        MyBinaryTree<U> t;
        t.val_ = v;
        if (l) t.left_.push_back(*l);
        if (r) t.right_.push_back(*r);
        return t;
    }

public:
    MyBinaryTree<T>* left () { return left_.empty() ? 0 : &*left_.begin(); }
    MyBinaryTree<T>* right () { return right_.empty() ? 0 : &*right_.begin(); }
    T & val () { return val_; }
};

MyBinaryTree<int> make_a_tree ()
{
    MyBinaryTree<int> n1 = MakeMyBinaryTree(1);
    MyBinaryTree<int> n3 = MakeMyBinaryTree(3);
    return MakeMyBinaryTree(2, &n1, &n3);
}

而不是 list<> ,您可以使用 Boost.Optional ,或者如果您可以使用 C++14, std::optional .

关于c++ - 如何在 C++ 函数中构造二叉树并返回它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16910035/

相关文章:

c++ - C++ 中的多键自定义排序

c++ - 为什么 C++11 中仍然需要 "using"指令来从基类中引入在派生类中重载的方法

c++ - 如何将 wchar[260] 和 wchar_t 转换为 const char *

c++ - 发送数据lwip STM32 PC

C++ WinINet InternetReadFile 函数刷新

c++ - C++ 20 std::chrono::duration格式的缺点

c++ - 我使用 Qt 的多线程应用程序出了什么问题(错误 SIGSEGV)

python - 使用python3的OpenCV2中的cvCreateMat函数等效于什么

c++ - for 循环、读取和写入文件有困难

c++ - 如何在 C++ 代码中逐步使用行内的特定函数