【发布时间】:2011-12-22 13:15:06
【问题描述】:
致力于在 C++ 中实现我自己的 BST,以获得处理此类结构的经验。
我在实现析构函数时遇到了麻烦。我在研究中发现,不能真正拥有递归析构函数(由于一个标志不允许在调用同一个对象后调用析构函数),但我不太确定其他成功清理树中所有节点的方法。
作为补偿,我创建了一个辅助函数 - 但是这会在“删除 n”行上引发未解决的外部错误。有什么建议吗?
代码:
void BinSearchTree::Clear(tNode* n)
{
if (n->left != NULL)
Clear(n->left);
if (n->right != NULL)
Clear(n->right);
delete n;
n = NULL;
size--;
}
【问题讨论】:
-
它与问题无关,但您不需要将变量
n设置为NULL,因为它不再在函数中访问。 -
@JoachimPileborg 设置空状态只是因为可以独立于析构函数调用 Clear 来重置树。在使用 size 数据成员来跟踪此类事情之前,我最初是在测试是否缺少有效的根指针来确定树是否已初始化。
-
出于好奇,有谁知道在树的标准实现中大小是否通常是一个跟踪值?我认为它没有什么用处,因为迭代循环在模型上是不现实的。
-
变量
n是 this 函数的本地变量。在函数中将其设置为 NULL 不会在函数外部将其设置为 NULL,那么您需要将n作为对指针的引用 (tNode *&) 或作为指向指针的指针 (tNode **) 传递。 -
你的节点中有父指针吗?
标签: c++ data-structures recursion