左と右の子が等しく、親よりも小さい場合、最小ヒープから値を削除するにはどうすればよいですか。たとえば、最小ヒープのルートに値 0 があり、それを削除したいとします。0 をベクターの最後の要素 (値 = 12) と交換します。その後、ベクターを再び最小ヒープに変換する関数を実行する必要があります (最小ヒープ) が、私の例では 0 を交換しました12 で、現在 12 がルートにあり、すぐに 0 が返されます。12 を左の子 (1) または右の子 (1) と交換する必要があります。この番号 1 のどちらが最初にベクトルに入力されたかを知るにはどうすればよいですか?
#include <stdio.h>
#include <stdlib.h>
int left(int i){
return 2*i;
}
int right(int i){
return 2*i +1;
}
void swap_pos(int *vi, int *vm){
int aux;
aux = *vi;
*vi = *vm;
*vm = aux;
}
void heapify(int *v, int i,int heap_size){
int l,r,menor_ind = i;
l = left(i);
r = right(i);
if(l<=heap_size && v[l]<v[i]) menor_ind = l;
if(r<=heap_size && v[r]<v[menor_ind]) menor_ind = r;
if(menor_ind!= i){
swap_pos(&v[i],&v[menor_ind]);
heapify(v,menor_ind,heap_size);
}
}
void build_min_heap(int v[],int heap_size){
int i;
for(i=heap_size/2; i>=1; i--){
heapify(v,i,heap_size);
}
}
int extract(int *v, int *heap_size){
int ret = v[1];
if(*heap_size==0) return -1;// erro
swap_pos(&v[*heap_size],&v[1]); // swap root with the last element
(*heap_size)--;
heapify(v,1,*heap_size);
return ret;
}
void heap_sort(int *v, int *heap_size){
while(*heap_size>=2){
swap_pos(&v[1],&v[*heap_size]);
(*heap_size)--;
heapify(v,1,*heap_size);
}
}
int main(void){
int heap_size = 9;
int i, v[] = {-1,6,12,3,1,5,0,1,9,7};
build_min_heap(v,heap_size);
printf("%d\n",extract(v,&heap_size));
//heap_sort(v,&heap_size);
for(i=1; i<=heap_size; i++){
printf("%d ",v[i]);
}
return 0;
}