如何从可熔堆中删除特定节点?我知道如何删除根,然后将左右节点融合在一起。我不知道如何找到一个特定的节点,删除它并修复其余的节点。任何意见,将不胜感激。谢谢
答案 0 :(得分:1)
当您删除堆中间的节点时,您要做的第一件事就是更新父节点,以使父节点不再指向要删除的节点。从本质上讲,您现在有两个堆:原始堆和根于要删除节点的子堆。
然后,在第二个堆(植根于要删除的节点的堆)中,调用remove
。这样将删除最小的项目,即您要删除的节点,并修复堆。
最后,将第二个堆与主堆合并。
困难的部分是找到要删除的节点。这就需要遍历树结构,检查每个节点的密钥。
如果要避免顺序扫描,则必须创建一个单独的数据结构,例如将键映射到堆节点的哈希映射。通常,您将具有包装器数据结构。如下所示,虽然可以原谅语法。 Java不是我的强项:
class IndexableHeap
{
MeldableHeap theHeap;
HashMap<key, Node> index
void add(node)
{
theHeap.add(node);
index.add(node.x, node);
}
remove()
{
theHeap.remove(node);
index.remove(node.x);
}
}
我想你明白这个主意。