c++ - 释放内存二叉树

标签 c++ binary-tree huffman-code

我有一个创建二叉树的函数(*build_tree)* (Huffman)。

我还需要一个函数来释放构建树分配的内存。

这是我第一次使用二叉树,所以我有点困惑。 我应该创建一个循环来遍历树中的每个节点并将其删除吗? 我应该考虑该节点是叶子节点还是父节点?

void free_memory(NodePtr root)
{
    delete root;
}

struct HuffmanNode
{
   //some stuff
    HuffmanNode *left;
    HuffmanNode *right;
};

如果有人可以帮助我开始,我将不胜感激:)

最佳答案

如果您使用智能指针,问题就会自行解决。如果每个节点都包含其子节点的私有(private) SP,并且您删除一个节点,那么它的所有子节点也将被释放。显然,您的类析构函数(在清理时将由 SP 调用)需要释放任何其他非 RIIA 分配的资源(如果存在)。

class Node
{
private:
   std:unique_ptr<Node> left;
   std:unique_ptr<Node> right;
}

我正在使用std::unique_ptr<>在这里,因为我假设这些是私有(private)的,不会暴露给程序的其他部分。如果您希望其他事物使用这些指针引用节点,那么您应该使用 std::shared_ptr<> .

如果您不使用 SP,则类析构函数需要自行完成工作,并且您必须更加小心内存泄漏。每个类的析构函数都会删除其子级,而子级又将调用每个子级中的析构函数。

class Node
{
private:
  NodePtr left;
  NodePtr right;

  ~Node()
  {
     delete left;
     delete right;

     // Delete any other resources allocated by the node.
  }
}

您还可以按照@OldProgrammer的建议进行操作,并自下而上遍历树并删除节点。请记住,您必须自下而上进行此操作。如果您自上而下执行此操作,那么您将丢失对(到目前为止)未删除的子节点的引用并泄漏内存。正如您所看到的,递归删除的代码 ( as referenced in @unluddite's answer ) 要复杂得多。

递归执行(任何操作)都会产生内存开销。请参阅:Is a recursive destructor for linked list, tree, etc. bad? 。如果您的树非常大,那么您应该考虑这一点并进行相应的测试。

如果您同意使用 SP,我的建议是第一个解决方案。

关于c++ - 释放内存二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21833864/

相关文章:

algorithm - 查找BST中任意key后的后继节点

c++ - 逐层遍历和打印二叉树

python - 如何在 Python 中将二叉树打印为节点结构

algorithm - 无需构建树即可预测霍夫曼压缩率

c++ - 给定数字的浮点分辨率

c++ - 范围内的连续随机数

matlab - MATLAB 中的霍夫曼编码 - 传输字典/树

c - C中的霍夫曼编码

C++ 在我的电脑上运行良好,但在 leetcode 上出现地址清理器堆缓冲区溢出错误

c++ - 初始化仅由一组对象共享的静态变量 C++