一、堆得删除操作的简单思路
1、首先我们判断堆是不是为空,然后获取我们的堆顶元素,和我们的最后一个元素,进行交换。
2、我们删除我们的最后一个元素,删除的元素,就是我们的堆顶元素,如果是最大堆,是最大元素,如果最小堆,就是最下元素。
3、我们对第一个元素,进行shift'Down操作。因为堆得定义,比如最大堆,就是堆中的任意节点都会下于等于它的父亲节点。我们第一个元素,必须进行和它的孩子节点比较,找到最大的元素替换它的位置,然后,继续向下走。知道满足堆得性质。
// 看堆中的最大元素
public T getMax() {
if (size() == 0) {
throw new IllegalArgumentException("堆中没有数据");
}
return data.get(0);
}
public T extractMax() {
T res = getMax();
data.swap(0,size()-1); //交换第一个元素和最后一个元素
data.removeLast(); //移除最后一个元素。
shiftDown(0); //shiftDown第一个元素
return res;
}
private void shiftDown(int i) {
while(getLeftChild(i)<size()){ //首先默认
int j=getLeftChild(i); //j 表示的是要找的元素
if(j