我很难理解我的教授给我的有关堆的问题之一的解决方案。
给出例程Min-Heap-Delete(A,k)的伪代码。假设密钥k在位置l 堆的1≤l≤n。
我的解决方法是
将A [k]与A [A.size()-1]
A.size()= A.size()-1
Min-heapify(A,k)
但是,我的解决方案与第一部分的教授有所不同。
将A [k]与A [A.heap_size()]
A.heap_size()= A.heap_size()-1
Min-heapify(A,k)
我们为什么要使用A.size()而不是A.size()-1?因为堆从索引1开始,A.size()不会在代表堆的数组上建立索引吗?
在这种情况下,A.size()将给我们10。但是,A [10]不存在,并且会导致错误。因此,为什么不使用A [10-1]获取堆树中的最后一个节点?
答案 0 :(得分:2)
因为教授使用的是从1开始的计数,而不是从零开始的计数。注意-bitexact
条件。您可能会错过索引是A。 heap_size -堆大小而不是数组大小,因此最后一个元素将称为1 ≤ l ≤ n
这是相当普遍的做法,并且对于堆来说很方便,因为子/父索引关系看起来非常简单:
A[9]
请注意,图片中的数组实际上是基于zeo的,未使用零条目