如何从内存中删除二进制搜索树?

时间:2010-02-11 00:11:08

标签: c++ memory memory-management linked-list binary-tree

我有一个BST,它是C ++中的链表。我如何从记忆中删除整个东西?它会从一个类函数完成吗?

5 个答案:

答案 0 :(得分:4)

只需删除孩子:

struct TreeNode {
    TreeNode *l, *r, *parent;
    Data d;

    TreeNode( TreeNode *p ) { l = nullptr; r = nullptr; parent = p; }
    TreeNode( TreeNode const & ) = delete;
    ~TreeNode() {
         delete l; // delete does nothing if ptr is 0
         delete r; // or recurses if there's an object
    }
};

或者如果您使用unique_ptr或其他类似内容,则甚至不需要:

struct TreeNode {
    unique_ptr< TreeNode > l, r;
    TreeNode *parent;
    Data d;

    TreeNode( TreeNode *p ) { l = nullptr; r = nullptr; parent = p; }
    TreeNode( TreeNode const & ) = delete;
    ~TreeNode() = default;
};

答案 1 :(得分:3)

如果您可以访问链接列表本身,那就简单了:

// Making liberal assumptions about the kind of naming / coding conventions that might have been used...
ListNode *currentNode = rootNode;

while(currentNode != NULL)
{
    ListNode *nextNode = currentNode->Next;
    delete currentNode;
    currentNode = nextNode;
}

rootNode = NULL;

如果这是BST的自定义实现,那么它可能就是如何在内部工作,如果它将自己绑定到特定的数据结构。

如果您无法访问内部,那么Potatoswatter的回答应该是正确的。假设BST按照他们的建议进行设置,那么只需删除根节点就应该自动删除所有已分配的内存,因为树中的每个父节点都会删除它的子节点。

如果您询问如何手动迭代二叉树,那么您将执行以下递归步骤:

void DeleteChildren(BSTNode *node)
{
    // Recurse left down the tree...
    if(node->HasLeftChild()) DeleteChildren(node->GetLeftChild());
    // Recurse right down the tree...
    if(node->HasRightChild()) DeleteChildren(node->GetRightChild());

    // Clean up the data at this node.
    node->ClearData(); // assume deletes internal data

    // Free memory used by the node itself.
    delete node;
}

// Call this from external code.
DeleteChildren(rootNode);

我希望我没有错过这里的观点,这有点有用。

答案 2 :(得分:1)

执行树的后序遍历(即访问父母之前的孩子),并在访问时删除每个节点。

这是否与课程有关,完全取决于你的实施。

答案 3 :(得分:0)

提供的信息有限......

如果使用new或malloc(或相关函数)分配节点,则需要遍历所有节点并释放或删除它们。

另一种方法是将shared_ptr's (and weak_ptr's to kill cyclics)放入您的分配中 - 只要您正确执行此操作,就不必手动释放节点

如果您使用的是在互联网上提取的质量实施,而不是课程没有泄漏,您不必担心任何事情。

答案 4 :(得分:0)

使用智能指针并忘记它。