销毁二叉树中的节点

Destroying nodes in a binary tree

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

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

并且我在析构函数中使用了方法

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

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

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

为什么需要递归驱动程序?就这样

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

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

dtor 将在整个树的所有节点中被调用。

您可以广度删除具有 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。一个节点不能在销毁时自动删除它的子节点。这样做会引发双重删除和大量未定义行为。