我有一个BST,它是C ++中的链表。我如何从记忆中删除整个东西?它会从一个类函数完成吗?
答案 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)
使用智能指针并忘记它。