我在完全删除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 tree的主要函数中,我使用了一个简单的if语句
template <class myType>
void avlTree<myType>::destroyTree()
{
  destroyTree(root);
  if(root == NULL)
    std::cout << "destroyed" << std::endl;
}

显示root不是null(不会打印是)

最佳答案

看一下这段代码:

destroyTree(root);
if(root == NULL)
    std::cout << "destroyed" << std::endl;

可能您的destroyTree函数具有以下原型(prototype):
void destroyTree(nodeType<myType> *node);

问题在于节点无法更新 call 者的内存地址,而只能更新 call 者指向的内容。这意味着root将永远不会被更新,即其内容不能被更新为NULL。

为此,您需要一个类似以下内容的原型(prototype):
void destroyTree(nodeType<myType> **node);

关于c++ - 销毁整个AVL树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26132521/

10-13 02:40