问题描述
当前尝试在此处使用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不会产生有效的最小堆。