Algorithm 在最小-最大堆中删除最大操作
我正在实现一个minmax堆,一种双端优先级队列。您可以在这里查看有关最小-最大堆的更多信息 插入和删除最小操作的代码很简单,可以在网上找到。但是,我也尝试在minmax堆上实现deletemax操作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
最初,我认为最小最大堆中的删除max与Max Min堆中的删除max相同(如果我们考虑包含最大元素的最小最大堆的子树,它类似于最大最小堆)。因此,实现将非常简单,类似于删除最小最大堆的最小值
但是,有一个问题: 如上图所示,尽管70是max元素,但minmax堆的最后一个元素(12)不在包含70的子树中。那么,我可以用它来替换删除70后左子树中留下的间隙吗 如果我们不使用该元素,而是遵循max-min-heap的delete-max过程,并使用20来替换间隙,那么插入堆中的下一个元素将位于10的右子元素,并且永远不会有9的右子元素那么,有人能帮我吗?我认为删除最后一层最右边的节点并用它替换已删除的max元素是正确的,即使它在树中交叉。理由如下:
希望这有帮助由于删除随机密钥的问题与如何在删除max之后修复堆的问题不同,所以我会考虑把它作为一个单独的问题。@ TeMtPyTyPyff编辑了这个问题,重点是“如何删除最大元素”。您现在可以在这里找到一个关于“如何从最小-最大堆中删除任何节点”的建议解决方案的具体问题:这也是我在几个月前编写最小-最大堆数据结构时实现它的方式。(+1)这可以删除最小-最大堆中的最大元素,但是您确定这对最小-最大堆中的任何节点都有效吗?如果是,您会使用哪一种“修正”?使用“滴流”操作不起作用,请查看我对此要点所做的唯一说明问题的评论: