如何插入作为二叉树实现的二进制最大堆?

时间:2013-02-08 19:43:54

标签: algorithm data-structures language-agnostic tree binary-heap

在二进制最大堆中实现为二叉树(其中每个节点存储指向其父节点,左子节点和右子节点的指针),如果指针指向堆的根,则如何实现插入操作?应该发生的是节点首先作为最后一行中的最后一个元素插入。对于基于数组的,您可以附加到数组,但是对于基于树的实现,您如何找到正确的位置?

3 个答案:

答案 0 :(得分:1)

this older question中,我给出了一个使用数字 k 的二进制表示的简短算法,以便找到一种方法来选择 k -th自上而下遍历中的节点超出二进制堆。假设您跟踪二进制堆的显式树表示中的节点数,您可以执行以下操作来执行插入操作:

  1. 使用上述算法,确定新节点应该去的位置,然后在该位置插入节点。
  2. 通过重新连接树以与其父节点交换它或通过交换节点及其父节点的数据字段直到元素处于其最终位置,继续向上冒泡节点。
  3. 希望这有帮助!

答案 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/

我希望它对你有所帮助,如果有,请告诉我......! ☺