我在完全删除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;
但这似乎没有正确删除节点,在检查高度时它仍然在调用destroy之前给出了高度,尽管在尝试打印时崩溃了。在调用destroy树的main函数中,我使用了一个简单的if语句
template <class myType>
void avlTree<myType>::destroyTree()
{
destroyTree(root);
if(root == NULL)
std::cout << "destroyed" << std::endl;
}
表明root不为null(是的,不打印)
答案 0 :(得分:3)
看看这段代码:
destroyTree(root);
if(root == NULL)
std::cout << "destroyed" << std::endl;
你的destroyTree函数可能有这个原型:
void destroyTree(nodeType<myType> *node);
问题是节点无法更新调用方内存地址,只能更新调用方指向的内容。这意味着root永远不会更新,即其内容不能更新为NULL。
要做到这一点,你需要一个类似的原型:
void destroyTree(nodeType<myType> **node);
答案 1 :(得分:2)
我猜测你没有通过引用获取节点,因此当您将节点设置为NULL
时,您实际上正在设置将节点的本地副本设为null。
因为root
被值占用而无法工作 - 在函数调用后将具有先前值:
template <class myType>
void avlTree<myType>::destroyTree(nodeType<myType>* node) // note node taken by value here
{
if(node != NULL) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
node = NULL;
}
可行,因为root
是通过引用获取的 - 在函数调用后将为null:
template <class myType>
void avlTree<myType>::destroyTree(nodeType<myType>* &node) // note node taken by reference here
{
if(node != NULL) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
node = NULL;
}