递归函数销毁通用树

Recursive function to destroy general tree c++

本文关键字:递归函数      更新时间:2023-10-16

这就是我到目前为止在SkillTree构造函数中调用的DestroyTree函数:

void SkillTree::DestroyTree(Node*& root)
{
  if(root)
  {
      for(int i = 0; i < child_max && root && root->child[i]; ++i)
      {
          if(root)
          {
              DestroyTree(root->child[i]);
              delete root;
              root = NULL;
          }
      }
  }
}

我有点尴尬所有的检查根,但我只是想让它工作。

也这里是我的类定义的一部分,如果它是有帮助的…

class SkillTree
{
  public:
    SkillTree(void);
    ~SkillTree(void);   
  protected:
    struct Node
    {
       Node() : max(DEFAULT_CHILD_MAX), child(new Node*[DEFAULT_CHILD_MAX])
        {
            for(int i = 0; i < max; ++i)
                child[i] = NULL;
        }
       ~Node()
       {
           for(int i = 0; i < max; ++i)
               delete child[i];
           child = NULL;
       }
       int max;
       Skill data;
       Node** child;    //a dynamic array of child pointers
    };
    void DestroyTree(Node*& root);
    int child_max;
    const static int DEFAULT_CHILD_MAX = 3;
    char* title;
    Node* root;
};

我不认为最左边的节点和其他子节点一起被删除,除了三个中的第一个。我知道我有一个内存泄漏,所以我希望,如果我得到这个修复然后我的内存泄漏问题也将被修复。

DestroyTree函数应该是这样的:

void SkillTree::DestroyTree()
{
    if (root)
    {
        delete root;
        root = NULL;
    }
}

和Node析构函数:

Node::~Node()
{
    for (size_t i = 0; i < max; ++i)
    {
        if (child[i])
            delete child[i];
    }
    delete [] child;
}

列出每个变化的原因有点长。如果有不清楚的地方,请随时提问!

问题在于无论根节点有多少个子节点,它只迭代(递归)一次

的原因吗?删除并重置循环内的root指针,并将root指针作为循环的条件。

您应该只初始检查root为非空,然后在循环后删除/重置

您应该在Node的析构函数中使用delete[] child;,而不是删除单个子节点。这是因为child是用new[]构造的。不这样做会导致未定义行为。