【问题标题】:Destroying nodes in a binary tree销毁二叉树中的节点
【发布时间】:2021-07-12 12:07:27
【问题描述】:

假设我有一棵二叉树。我使用new创建节点,但现在我想在析构函数中删除它们:

void BinaryTree::recursiveDestructor(Node *& noeud){
    if (node != 0) {
        recursiveDestrutor(node->leftTree);
        recursiveDestructor(node->rightTree);
        delete node;
        node = 0;
    }
}

我使用析构函数中的方法

BinaryTree::~BinaryTree(){
    recursiveDestructor(root);
}

有没有办法在析构函数中只使用whilefor 循环,而不是递归调用析构函数中的方法?使用循环会更快,并且避免在析构函数中使用方法。如果我不能使用循环,有没有办法提高性能?

【问题讨论】:

  • 无论如何你都需要一些堆栈,搜索binary tree iterative traversal
  • 是的。使用队列。在BinaryTree 析构函数中,将非空根推入队列,然后循环 (a) 弹出队列的头部。 (b) 将刚刚弹出的节点的非空左右指针推入队列, (c) 删除刚刚弹出的节点。重复。当队列为空时,您就完成了。
  • @WhozCraig 你能告诉我使用 c++ 会是什么样子吗?
  • @notaprogrammertoday 已发布。祝你好运。

标签: c++ binary-tree destructor


【解决方案1】:

为什么需要递归 dtor?做吧

Node::~Node()
{
   delete left;  // assuming left and right are both an instance of Node
   delete right;
}

BinaryTree::~BinaryTree() {
   delete root;
}

dtor 将在整个树中调用,遍历所有节点。

【讨论】:

  • “为什么需要递归 dtor” - 仅供参考,递归 dtor。
【解决方案2】:

您可以使用std::queue 广度删除树。注意:这是在没有语法检查的情况下在网上敲定的,但希望你能明白:

BinaryTree::~BinaryTree()
{
    if (!root)
        return;

    std::queue<Node*> q;
    q.push(root);
    while (!q.empty())
    {
        Node *p = q.front();
        q.pop();
        if (p->left)
            q.push(p->left);
        if (p->right)
            q.push(p->right);
        delete p;
    }
}

注意:节点子生命周期管理是必要的。 IE。一个节点不能在销毁时自动删除它的子节点。这样做会导致双重删除和大量未定义的行为。

【讨论】:

    【解决方案3】:

    如果您的树节点存储它们的父节点,则可以从任何位置找到以下节点,并且您可以对其执行 while 循环,但这将比递归形式花费更多时间(因为对 next() 的调用将需要不仅仅是一个节点步骤,而递归下降永远不会花费超过一个步骤来找到下一个要释放的节点)。

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2023-04-07
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多