为什么 z 没有在最小堆中冒泡?

Why isn't the z bubbling down in the min heap?

我正在练习 Heap Practice

中的一个数据结构练习题

objective是用给定的数组构造一个最小堆的构造函数。作者已经为我们提供了这样做的高级算法,"If you just "向下冒泡“堆的所有非叶节点,从最后一个非叶节点开始到根结束,当你完成时该数组将重新排列为正确的堆顺序

下面是我编写该算法的方法

public HeapPriorityQueue(E[] theElements) {
    elements = theElements;
    size = 0;
    int len = theElements.length;
    for(int c= len - 1;c>=1; c --) {
        if(elements[c] != null) {
            size ++;
            if(hasLeftChild(c))
                bubbleDown(c);
        }           
    }   
}

有人看到代码有问题吗?我确保从 "non-leaf node and end at the root" 开始,从数组的末尾开始,一直到代表堆根的索引 1。我什至确保在调用提供的 bubble down 方法之前检查该节点是否为非叶节点。

当输入
[null, b, f, a, z, x, k, q, j]
我的代码生成 [a, f, b, z, x, k, q, j] 的输出,与 [a, f, b, j, x, k, q, z] 的预期输出不匹配。我明白为什么它没有(z 没有冒泡)。
有谁知道如何修复这个程序以便它可以匹配预期的输出?奇怪的是 'z' 没有冒泡,但 'b' 在我的代码中冒泡了。

这里是作者对最小堆的实现,你要将这个构造函数添加到Stepp Min Heap

问题是我过早地重置了大小。
这里是作者对 hasLeftChild()

的实现
private boolean hasLeftChild(int index) {
    return leftChild(index) <= size;
}
private int leftChild(int index) {
    return index * 2;
}

通过将大小设置为零,并在我从末尾进行的每一次传递中递增它,当达到 'z' 或索引 4 时,大小字段将仅为 5,而不是它应该的值是 8。如果它是 8,则对 hasLeftChild 的调用将评估为 true,并且 'z' 将向下冒泡。不管我怎么处理,永远不会调用 bubble down。
这就是我修复代码并通过所有测试的方式。

public HeapPriorityQueue(E[] theElements) {
    elements = theElements;
    size = theElements.length - 1;
    int len = theElements.length;
    for(int c= len - 1;c>=1; c --) {
        if(elements[c] != null) {
            if(hasLeftChild(c)){
                bubbleDown(c);
            }
        }          
    }
}