Algorithm 在最小-最大堆中删除最大操作

Algorithm 在最小-最大堆中删除最大操作,algorithm,data-structures,heap,minmax-heap,Algorithm,Data Structures,Heap,Minmax Heap,我正在实现一个minmax堆,一种双端优先级队列。您可以在这里查看有关最小-最大堆的更多信息 插入和删除最小操作的代码很简单,可以在网上找到。但是,我也尝试在minmax堆上实现deletemax操作 最初,我认为最小最大堆中的删除max与Max Min堆中的删除max相同(如果我们考虑包含最大元素的最小最大堆的子树,它类似于最大最小堆)。因此,实现将非常简单,类似于删除最小最大堆的最小值 但是,有一个问题: 如上图所示,尽管70是max元素,但minmax堆的最后一个元素(12)不在包含70

我正在实现一个minmax堆,一种双端优先级队列。您可以在这里查看有关最小-最大堆的更多信息

插入和删除最小操作的代码很简单,可以在网上找到。但是,我也尝试在minmax堆上实现deletemax操作

最初,我认为最小最大堆中的删除max与Max Min堆中的删除max相同(如果我们考虑包含最大元素的最小最大堆的子树,它类似于最大最小堆)。因此,实现将非常简单,类似于删除最小最大堆的最小值

但是,有一个问题:

如上图所示,尽管70是max元素,但minmax堆的最后一个元素(12)不在包含70的子树中。那么,我可以用它来替换删除70后左子树中留下的间隙吗

如果我们不使用该元素,而是遵循max-min-heap的delete-max过程,并使用20来替换间隙,那么插入堆中的下一个元素将位于10的右子元素,并且永远不会有9的右子元素


那么,有人能帮我吗?

我认为删除最后一层最右边的节点并用它替换已删除的max元素是正确的,即使它在树中交叉。理由如下:

  • 删除最后一个级别中最右边的节点不会更改该树中任何节点需要保留的任何不变量:处于最小级别的所有节点仍然小于其所有后代,处于最大级别的所有节点仍然大于其后代

  • 这棵树仍然是一棵完整的二叉树

  • 移动此节点后,可以在max-min堆中使用正常的修复过程,以确保左子树不变量仍然保持不变


    希望这有帮助