最小堆中的堆低方法

问题描述

当前尝试在此处使用Repl来掌握Min Heap:https://repl.it/@Stylebender/Minheap#index.js

最小堆容量为5。

一旦我插入第6个元素(50),我们就交换元素在索引0和索引5的位置,并从堆中弹出最小的元素,而将堆保留为:

[50,10,20,40,30]

我的特定查询必须处理39-40行。

正如您从控制台日志中看到的那样,第一次调用trickDown()方法时,代表索引位置50的min(0)成为leftChild,并最终与索引1交换位置,结果如下:

[50,10,20,40,30]

但是,在第二次调用rickleDown()方法时,位于索引1的50假定为rightChild的位置,并与索引4交换位置以形成最终堆,如下所示:

[10,30,20,40,50]

也许我只是错过了一些东西,但是我不确定为什么min决定在第一轮中成为leftChild并在第二轮中成为rightChild,因为不会50,因为min堆中的最大元素同时满足For每次调用方法时都会循环吗?

解决方法

在第一个电话中,我们比较了50、10和20。
min从0开始,表示50。
10小于50,因此min变为1。
20 小于10,因此min不变。
我们找到了最低要求:10。

在第二个通话中,我们比较50、40和30。
min从1开始,表示50。
40小于50,所以min变成3。
30小于40,所以min变成4。
我们发现了最小值:30。

找到小于50的元素是不够的;我们必须找到最小值。交换50和20不会产生有效的最小堆。