递归函数销毁通用树
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[]
构造的。不这样做会导致未定义行为。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数