在二进制最大堆中实现为二叉树(其中每个节点存储指向其父节点,左子节点和右子节点的指针),如果指针指向堆的根,则如何实现插入操作?应该发生的是节点首先作为最后一行中的最后一个元素插入。对于基于数组的,您可以附加到数组,但是对于基于树的实现,您如何找到正确的位置?
答案 0 :(得分:1)
在this older question中,我给出了一个使用数字 k 的二进制表示的简短算法,以便找到一种方法来选择 k -th自上而下遍历中的节点超出二进制堆。假设您跟踪二进制堆的显式树表示中的节点数,您可以执行以下操作来执行插入操作:
希望这有帮助!
答案 1 :(得分:1)
如果你把你的新顶点挂在树的任何一个叶子下面(作为左边或右边的后继,无所谓),然后将这个新顶点修复到顶部(也就是说,每个其他顶点都有后继者) ,如果需要,将它与更大的继承者交换并爬上去,你的新元素将发现它是合法的地方而不会破坏堆。但是,这只能保证每隔一次插入操作将花费O(h)时间,其中h是树的最大高度。 最好将堆表示为数组,显然,因为这样可以保证每次插入操作都需要O(logN)时间。
答案 2 :(得分:0)
为了找到应该插入新节点的确切位置,我们使用二进制堆大小的二进制表示。这需要O(log N),然后我们冒泡它需要O(log N)。因此插入操作需要O(log N)...有关详细说明,请查看我的博客关于Binary Heaps的帖子 -
http://theoryofprogramming.com/2015/02/01/binary-heaps-and-heapsort-algorithm/
我希望它对你有所帮助,如果有,请告诉我......! ☺