我正在实现一个min-max堆,一种双端优先级队列。您可以在此处查看here以获取有关最小 - 最大堆的更多信息。
插入和删除操作的代码很简单,可在网上找到。但是,我也试图在最小 - 最大堆上实现 delete-max 操作。
最初,我觉得min-max堆中的delete-max与max-min堆中的delete-max相同(如果我们考虑包含最大元素的min-max堆的子树,它类似于max-min堆)。因此,实现将是简单的,类似于min-max堆的delete-min。
但是,有一个问题:
从上图中可以看出,尽管70是最大元素,但是最小 - 最大堆的最后一个元素(12)不在包含70的子树中。所以,我可以删除70后,用它来代替左子树中留下的空隙?
如果我们不使用该元素而是使用 max-min heap的
那么,任何人都可以帮助我吗?
答案 0 :(得分:3)
我认为删除最后一级最右边的节点并使用它替换已移除的最大元素是正确的,即使它在树中交叉。理由如下:
删除最后一级中最右边的节点不会更改任何需要为该树中的任何节点保留的不变量:所有最小级别的节点仍然小于其所有后代,并且所有节点都是最高级别的节点仍然大于其后代。
树仍然是完整的二叉树。
一旦移动了这个节点,就可以在max-min堆中使用正常的fixup过程,以确保左子树不变量仍然存在。
希望这有帮助!