【问题标题】:Destroy entire AVL tree销毁整个 AVL 树
【发布时间】: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-&gt;leftnode-&gt;right 设置为 NULL。是什么让您认为节点没有被删除?
  • 这是一种方法?我对 C++ 的记忆不太好,但你非得说self.destroyTree 之类的话吗?
  • @JonathonReinhart 因为在调用destroyTree 之后调用我的高度函数仍然会给我高度,尽管它应该是零
  • 啊,也许你还需要将节点设置为NULL,然后再删除它?这样高度函数就不会只是遍历旧指针?
  • @TomZych 他们都是。

标签: c++ dynamic recursion avl-tree


【解决方案1】:

看这段代码:

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

可能你的 destroyTree 函数有这个原型:

void destroyTree(nodeType<myType> *node);

问题是节点不能更新调用者内存地址,只能更新调用者指向的内容。这意味着root永远不会被更新,即它的内容不能被更新为NULL。

为此,您需要一个类似的原型:

void destroyTree(nodeType<myType> **node);

【讨论】:

    【解决方案2】:

    我猜你没有将节点 通过引用,因此当你将节点设置为 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 是通过引用获取的 - 在函数调用后将为空:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2021-07-12
      • 1970-01-01
      相关资源
      最近更新 更多