销毁整个AVL树

时间:2014-10-01 00:56:38

标签: c++ dynamic recursion avl-tree

我在完全删除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(是的,不打印)

2 个答案:

答案 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;
}