我正在尝试删除(可比较e)对象说remove(2),但是当我尝试删除它时,它删除的是堆中不正确的节点,而不是我要删除的节点。
这是输出的样子。
删除Redwoods NP之前的堆:
Bryce Canyon NP Redwoods NP Joshua Tree NP Zion NP Yosemite NP Lassen Volcanic NP
[
null,
Bryce Canyon NP,
Redwoods NP,
Joshua Tree NP,
Zion NP,
Yosemite NP,
Lassen Volcanic NP
]
删除Redwoods NP后:
Bryce Canyon NP Redwoods NP Joshua Tree NP Zion NP Redwoods NP
[
null,
Bryce Canyon NP,
Redwoods NP,
Joshua Tree NP,
Zion NP,
Redwoods NP,
Lassen Volcanic NP
]
BUILD SUCCESSFUL (total time: 1 second)
预期
[
Bryce Canyon NP,
Joshua Tree NP,
Zion NP,
Yosemite NP,
Lassen Volcanic NP
]
我的代码
public void remove(Comparable e) throws NoSuchElementException {
if (size == 0) {
throw new NoSuchElementException("Heap is empty! Nothing to be removed");
}
Comparable toRemove = e;
System.out.println(Arrays.toString(heapData));
Comparable temp = heapData[size-1];
heapData[size-1] = toRemove;
toRemove = temp;
size--;
maxHeapify(heapData,size);
}
我的Add(可比较e)代码方法
public void add(Comparable e) {
if (size == heapData.length - 1) {
doubleSize();
}
int position = ++size;
for (; position > 1 && e.compareTo(heapData[position / 2]) < 0; position = position / 2) {
heapData[position] = heapData[position / 2];
maxHeapify(heapData, position);
}
heapData[position] = e;
}
答案 0 :(得分:0)
此处:
toRemove = temp;
//这行是错误的,您只更改堆中的对象,而不更改数组中的对象。 相反,首先编写一种方法来找到e在数组中的位置,并将temp对象分配给该位置
添加方法:
int findRemoveableIndex(Comparable[] input, Comparable e) {
for(int i = 0; i < input.length; i++) {
if(input[i].equals(e)) { // or ==
return i;
}
}
return -1;
}
然后,而不是上面的分配:
heapData[findRemoveableIndex(heapData, e)] = temp;