在最小-最大堆中执行删除最大操作

5
我正在实现一种双端优先队列——min-max堆。您可以在这里查看有关min-max堆的更多信息。
插入和删除最小值操作的代码很简单,并且可以在网络上找到。但是,我也尝试在min-max堆上实现delete-max操作。
最初,我认为min-max堆中的delete-max与max-min堆中的delete-max相同(如果我们考虑包含最大元素的min-max堆子树,则类似于max-min堆)。因此,实现将简单且类似于min-max堆的delete-min。
但是,有一个问题: enter image description here

如上图所示,尽管70是最大的元素,但最小-最大堆的最后一个元素(12)不在包含70的子树中。那么,在删除70后,我可以使用它来替换左子树留下的空缺吗?
如果我们不使用该元素,而是按照最大-最小堆的删除最大值过程,并使用20来替换空缺,则堆中插入的下一个元素将位于10的右子节点,并且永远没有9的右子节点。
所以,有人能帮帮我吗?

3
由于删除随机键的问题与在删除最大值后如何修复堆的问题不同,我建议将其作为单独的问题提出。 - templatetypedef
@templatetypedef 编辑了这个问题,重点是“如何删除最大元素”。您现在可以在此处找到一个具体的问题和一个提议的解决方案:“如何从min-max堆中删除任何节点”:http://stackoverflow.com/q/39392864/3924118 - nbro
1个回答

3
我认为即使在树中跨越,删除最后一层的右侧节点并将其用于替换已删除的最大元素是正确的。原因如下:
  1. 删除最后一层的右侧节点不会改变该树中任何节点必须保持的不变性:所有最小级别的节点仍然小于它们的所有后代,而所有最大级别的节点仍然大于它们的后代。

  2. 该树仍然是完整的二叉树。

移动此节点后,您可以使用正常的修复过程来确保最小堆中的左子树不变性仍然保持。

希望这可以帮助你!


这也是我几个月前写最小-最大堆数据结构时的实现方式。(+1) - Erik P.
这个方法可以移除最大的元素在min-max堆中,但你确定它适用于min-max堆中的任何节点吗?如果是的话,你会使用哪个“修复”呢?使用“向下渗透”操作是行不通的,请查看我在此gist中所做的唯一评论,其中显示了问题:https://gist.github.com/gnarmis/4647645 - nbro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接