堆的一个重要性质是,如果一个元素不满足堆的性质,那么从这个元素开始,到根节点的所有元素都存在这个问题,如果堆化该元素,从这个元素到根节点的所有元素也都满足堆的性质
public void precolateDown(int i){
if(i<= -1 || i > this.count){//this.count为堆中具有的元素数
return;
}
int l = 0;
int r = 0;
int max = 0;
int temp = 0;
l = leftChild(i);
r = rightChild(i);
//左元素校验
if(l != -1 && this.array[l] > this.array[i]){
//交换元素在容器数组中的位置指针
max = l;
}else{
max = i;
}
if(r != -1 && this.array[r] > this.array[max]){
max = r;
}
if(max != i){
//交换this.array[i] 和 this.array[max];
temp = this.array[i];
this.array[i] = this.array[max];
this.array[max] = temp;
}
percolateDown(max);
}
删除元素:
为了从堆中删除元素,只需要从根节点删除元素,这是标准堆支持的唯一操作,当删除根节点后,将堆的最后一个元素复制到这个位置,然后删除最后元素,当用最后的元素替换树根节点后,可能导致树不满足堆的性质,使其成为堆,需要堆化元素,调用堆化函数percolateDown()
int deleteMax(){
if(this.count == 0){
return -1;
}
int data = this.array[0];
this.array[0] = this.array[this.count -1];
this.count --;
percolateDown(0);
return data;
}