Java 为什么不是';z不是在最小堆中冒泡吗?

Java 为什么不是';z不是在最小堆中冒泡吗?,java,algorithm,tree,heap,binary-tree,Java,Algorithm,Tree,Heap,Binary Tree,我正在处理一个来自的实践数据结构问题 目标是为具有给定数组的最小堆生成构造函数。作者已经为我们提供了这样做的高级算法,“如果您只是“冒泡”掉堆中的所有非叶节点,从最后一个非叶节点开始,到根节点结束,当您完成时,数组将被重新排列成适当的堆顺序” 下面是我如何编写算法的 public HeapPriorityQueue(E[] theElements) {    elements = theElements;     size = 0;     int len = theElements.leng

我正在处理一个来自的实践数据结构问题

目标是为具有给定数组的最小堆生成构造函数。作者已经为我们提供了这样做的高级算法,“如果您只是“冒泡”掉堆中的所有非叶节点,从最后一个非叶节点开始,到根节点结束,当您完成时,数组将被重新排列成适当的堆顺序”

下面是我如何编写算法的

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);
        }           
    }   
}
有人看到代码有什么问题吗?我确保从“非叶节点和根节点”开始,从数组末尾开始,一直到表示堆根的索引1。我甚至确保在调用提供的冒泡下降方法之前检查该节点是否为非叶节点

当给出一个[null,b,f,a,z,x,k,q,j]的输入时,
[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冒泡


下面是作者对min heap的实现,您要将此构造函数添加到

问题在于我过早地重置了大小
以下是作者对hasleeftchild()的实现


什么是
bubbleDown
hasLeftChild
?助手方法。bubbleDown会将节点冒泡到正确的位置,并让LeftChild检查该节点是否有左子节点。显然,其中一个节点没有完成其工作,如果没有实际看到它们,则无法了解原因。因此,手动编写冒泡下降方法?我试着it@immibisbubbleDown的工作就是在“b”中冒泡
private boolean hasLeftChild(int index) {
    return leftChild(index) <= size;
}
private int leftChild(int index) {
    return index * 2;
}
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);
            }
        }          
    }
}