我发现了许多在数组中存储数据的MinMax堆实现。它真的很容易实现,这就是我寻找不同东西的方式。我想创建一个MinMax堆,只使用堆的元素,指针指向左子和右子(当然还有一个要比较的键)。因此,堆只有指向根对象(最低级别)的指针,而根对象有指向其子对象(最高级别)的指针,依此类推。我知道如何插入一个新对象(根据堆大小,使用int的二进制表示来找到合适的路径),但我不知道如何实现其余的(向上(向下)元素,查找父级或祖级)。
Thx请求帮助
发布于 2012-10-13 12:40:28
使用堆排序二叉树的优先级队列可以使用三重链表结构而不是数组来实现。每个节点需要三个链接:两个向下遍历,一个向上遍历。
发布于 2011-10-30 04:30:35
heapq module source code显示了实现向上和向下推送的步骤。要从数组实现切换到指针实现,请将arr[2*n+1]
计算替换为node.left
,将arr[2*n+2]
替换为node.right
。对于父引用,如arr[(n-1)>>1]
,每个节点都需要一个指向其父节点node.parent
的指针。
或者,您也可以采用函数式风格,这使得这一切都非常容易实现。我发现treaps implemented in Lisp的代码启发了我如何做到这一点。
发布于 2019-03-09 20:38:52
作为很久以前的一个任务的一部分,我已经解决了这个问题。你可以在here上找到它
我有多个用Java和C++实现的实现MinHeap的方法,其中有数组也有数组。有关解决方案,请参阅我的Java实现。是的,在没有数组的情况下实现堆是非常有可能的。您只需记住在何处插入下一个节点,以及如何堆和反堆即可。
Edit1:我还试图查找没有数组的min heap的任何现有解决方案,但没有找到任何解决方案。所以,我把它贴在这里,这样对任何想知道方法的人都会有帮助。
https://stackoverflow.com/questions/4698338
复制相似问题