C++ 摧毁整个AVL树

C++ 摧毁整个AVL树,c++,dynamic,recursion,avl-tree,C++,Dynamic,Recursion,Avl Tree,我在完全删除我的AVL树时遇到问题。我已经知道了如何只删除一个节点,但是我的destroyTree函数似乎并没有递归地销毁每个节点。我可能做错了什么 我有一个structnodeType 但这似乎并没有正确地删除节点,在检查高度时,它仍然提供调用destroy之前的高度,尽管在尝试打印时崩溃。在调用destroy tree的主函数中,我使用了一个简单的if语句 template <class myType> void avlTree<myType>::destroyTre

我在完全删除我的AVL树时遇到问题。我已经知道了如何只删除一个节点,但是我的
destroyTree
函数似乎并没有递归地销毁每个节点。我可能做错了什么

我有一个struct
nodeType

但这似乎并没有正确地删除节点,在检查高度时,它仍然提供调用destroy之前的高度,尽管在尝试打印时崩溃。在调用destroy tree的主函数中,我使用了一个简单的if语句

template <class myType>
void avlTree<myType>::destroyTree()
{
  destroyTree(root);
  if(root == NULL)
    std::cout << "destroyed" << std::endl;
}
模板
void avlTree::destroyTree()
{
树(根);
if(root==NULL)

std::cout看看这段代码:

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

std::cout看看这段代码:

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

std::cout我猜您没有引用节点,因此当您将节点设置为
NULL
时,实际上是将节点的本地副本设置为NULL

将不起作用,因为
由值获取-在函数调用后将具有优先值:

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

我猜您没有引用节点,因此当您将节点设置为
NULL
时,实际上是将节点的本地副本设置为NULL

将不起作用,因为
由值获取-在函数调用后将具有优先值:

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

看起来不错,但我建议在删除后设置<代码>节点>左>代码>节点> ->右< /COD> >代码> null >代码>。你认为节点没有被删除?这是一种方法?我不记得C++,但是你必须说一些类似于<代码>自我的东西吗?调用
destroyTree
后的函数仍然会给我高度,虽然它应该是零啊,也许你还需要在删除它之前将节点设置为
NULL
?这样高度函数就不会只遍历旧的指针了?@TomZych它们都是。看起来不错,但我建议设置
node->left
aND<代码>节点>右<代码> >代码> null >代码>删除。什么使节点不被删除?这是一种方法?我不记得C++,但是你必须说一些类似“代码>自我”的东西吗?高度虽然应该是zeroAh,但在删除它之前,可能还需要将节点设置为
NULL
?这样高度函数就不会只遍历旧指针了?@TomZych它们都是。
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;
}