【发布时间】:2012-05-05 13:02:21
【问题描述】:
我需要删除除根之外的前缀树的所有子级。我不问任何代码。我只需要一个方法来遍历和删除树的所有子节点。
【问题讨论】:
标签: c++ algorithm tree theory prefix-tree
我需要删除除根之外的前缀树的所有子级。我不问任何代码。我只需要一个方法来遍历和删除树的所有子节点。
【问题讨论】:
标签: c++ algorithm tree theory prefix-tree
您可以使用后序遍历来遍历树并删除节点为:
function deleteTree(node, tree_root) {
if (node != null) {
// recursively delete left sub-tree.
deleteTree(node->left, tree_root);
// recursively delete right sub-tree.
deleteTree(node->right, tree_root);
// time to delete the node..but only if it's not root.
if( node != tree_root) {
delete node;
}
}
}
并将上述函数调用为:
deleteTree(root,root);
【讨论】:
写一个方法delete,它接受一个树节点:
for each child in node
call delete on child
remove child from node
free child
对于根的每个孩子调用这个删除方法。
【讨论】:
有趣的是,你可能会做一些优雅的事情——删除后可能不会使用树,所以你可以编写一个节点的析构函数:
struct Node // Non-copyable!
{
Node *left, *right;
Node()
: left(NULL)
, right(NULL)
{
}
~Node()
{
delete left;
delete right;
}
};
仅此而已!你使用它:delete root。请注意,您可能不会在 delete 之前测试 NULL,因为它按照 C++ 标准运行良好(只是返回)。
【讨论】:
void DeleteChildren() { delete left; delete right; } :) 与上面的方法不同,你应该测试node != NULL