我试图删除二进制堆中的最小数字,并且我只能删除一次min但是在我尝试再次删除它之后它返回0时它不应该返回0只有最小数量的堆已经消失。我试图调试问题,但没有从中获益。如果有人能看到我没看到的东西,你能帮我看看问题吗?先感谢您。例如,在我从1-6插入堆后,我将在堆中有5 6 1 2 3 4,在我删除min之后它打印出2 3 4 5 6.但是如果我在之后删除它则打印出0而不是3 4 5 6.非常感谢任何帮助解决这个问题。
public class BHeap {
public int RemoveMin(){
while( curr != null ) {
if( curr.key < found.key ){
found = curr;
p_o = prev;
}
prev = curr;
curr = curr.rightSibling;
}
this.root = merge(found.leftmostChild);
return result;
}
答案 0 :(得分:2)
我相信在实现堆(这里是min-heap)时,你应该把它分成三种方法:
-Heapify(调用堆的元素:1。从{element,element.right,element.left}中选择最小元素,2。如果需要(如果元素不是三者中最小的元素),则交换带有元素的三个中最小的一个,并在元素上递归地向下修复堆),
-BuildHeap(只是恰当地调用Heapify),
-Extract-Min(1.将顶部元素与堆的最右边(最后一层)元素交换,2。删除已经交换的最小元素,3。在新的top元素上调用heapify(刚换过来修复堆。
我还认为堆是主要用作表结构而不是节点结构的结构。 &#34;算法简介&#34;通过Cormen,Leiserson,Rivest,Stein为它提供了良好的理论基础。
至于你的实现,据我所知你将你的find设置为当前根(它是堆中的最小元素),然后在堆中搜索一个较小的元素。你找不到任何比你的根更小的元素的元素,或者它根本不是一个小堆!