【发布时间】:2014-11-25 18:31:05
【问题描述】:
我在完全删除我的 AVL 树时遇到了问题。我已经想出了如何只删除一个节点,但我的destroyTree 函数似乎并没有真正递归地销毁每个节点。我可能做错了什么?
我有一个结构 nodeType<myType>
template <class myType>
struct nodeType {
myType keyValue;
int nodeHeight;
nodeType<myType> *left;
nodeType<myType> *right;
};
我试图删除所有现有节点:
if(node != NULL) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
node = NULL;
但这似乎没有正确删除节点,在检查高度时它仍然给我在调用销毁之前的高度,尽管在尝试打印时崩溃。在调用销毁树的主函数中,我使用了一个简单的 if 语句
template <class myType>
void avlTree<myType>::destroyTree()
{
destroyTree(root);
if(root == NULL)
std::cout << "destroyed" << std::endl;
}
显示 root 不为空(yes 不打印)
【问题讨论】:
-
对我来说看起来不错,但我建议在删除后将
node->left和node->right设置为NULL。是什么让您认为节点没有被删除? -
这是一种方法?我对 C++ 的记忆不太好,但你非得说
self.destroyTree之类的话吗? -
@JonathonReinhart 因为在调用
destroyTree之后调用我的高度函数仍然会给我高度,尽管它应该是零 -
啊,也许你还需要将节点设置为
NULL,然后再删除它?这样高度函数就不会只是遍历旧指针? -
@TomZych 他们都是。
标签: c++ dynamic recursion avl-tree