我的remove或rebuild方法出了点问题,当我第一次删除最低的数字时,最大的数字就移到了队列的最前面。它是使用数组列表的堆。
public E remove() throws HeapException {
E root = tree.get(0);
tree.set(0, tree.get(tree.size() - 1));
currentObjCount = tree.size() - 1;
tree.remove(tree.size() - 1);
rebuild(0, currentObjCount);
return root;
}
private void swap(int place, int parent) {
E tmp = tree.get(pos);
tree.set(place, tree.get(parent));
tree.set(parent, tmp);
}
private void rebuild(int root, int eSize) {
eSize = tree.size();
if (root * 2 > eSize && root * 2 + 1 > eSize) {
child = 2 * root + 1;
if (root * 2 + 1 <= eSize) {
if (tree.get(child + 1).compareTo(tree.get(child)) > 0) {
child++;
}
if (tree.get(root).compareTo(tree.get(child)) < 0) {
swap(root, child);
rebuild(child, eSize);
}
}
我的输出:
Inserting
8
-4 8
-4 8 8
-4 -1 8 8
-4 -1 8 8 8
-10 -1 -4 8 8 8
Removing
8 -1 -4 8 8
8 -1 -4 8
8 -1 -4
-4 -1
-1
我认为这是重建方法。它可能是比较符号,但如果是,我不知道是哪个符号。