Java如何删除可熔堆中的节点

时间:2018-11-28 04:51:51

标签: java heap

如何从可熔堆中删除特定节点?我知道如何删除根,然后将左右节点融合在一起。我不知道如何找到一个特定的节点,删除它并修复其余的节点。任何意见,将不胜感激。谢谢

1 个答案:

答案 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);
    }
}

我想你明白这个主意。