Chapter 9 Heap Structures
9.1 Min-Max Heaps
Program 9.1 : Procedure to insert into a min-max heap
void min_max_insert(element heap[], int *n, element item){
int parent;
(*n)++;
if(*n == MAX_SIZE){
fprintf(stderr, "The heap is full\n");
exit(1);
}
parent = (*n) / 2;
if(!parent)
heap[1] = item;
else switch(level(parent)){
case FALSE:
if(item.key < heap[parent].key){
heap[*n] = heap[parent];
verify_min(heap, parent, item);
}
else
verify_max(heap, *n, item);
break;
case TRUE:
if(item.key > heap[parent].key){
heap[*n] = heap[parent];
verify_max(heap, parent, item);
}
else
verify_min(heap, *n, item);
}
}
Program 9.2 : verify_max¡Gfunction
void verify_max(element heap[], int i, element item){
int grandparent = i / 4;
while(grandparent)
if(item.key > heap[grandparent].key){
heap[i] = heap[grandparent];
i = grandparent;
grandparent /= 4;
}
else
break;
heap[i] = item;
}
Program 9.3 : Function to delete the element with minimum key
element delete_min(element heap[], int *n){
int i, last, k, parent;
element temp, x;
if(!(*n)){
fprintf(stderr, "The heap is empty\n");
heap[0].key = INT_MAX;
return heap[0];
}
heap[0] = heap[1];
x = heap[(*n)--];
for(i = 1, last = (*n) / 2; i <= last;){
k = min_child_grandchild(i, *n);
if(x.key <= heap[k].key) break;
heap[i] = heap[k];
if(k <= 2 * i + 1){
i = k;
break;
}
parent = k/2;
if(x.key > heap[parent].key)
SWAP(heap[parent], x, temp);
i = k;
}
heap[i] = x;
return heap[0];
}
9.2 Deaps
Program 9.4 : Function to insert an item into a deap
void deap_insert(element deap[], int *n, element x){
int i;
(*n)++;
if(*n == MAX_SIZE){
fprintf(stderr, "The heap is full\n");
exit(1);
}
if(*n == 2)
deap[2] = x;
else switch(max_heap(*n)){
case FALSE:
i = max_partner(*n);
if(x.key > deap[i].key){
deap[*n] = deap[i];
max_insert(deap, i, x);
}
else
min_insert(deap, *n, x);
break;
case TRUE:
i = min_partner(*n);
if(x.key < deap[i].key){
deap[*n] = deap[i];
min_insert(deap, i, x);
}
else
max_insert(deap, *n, x);
}
}
Program 9.5 : Delete min function
element deap_delete_min(element deap[], int *n){
int i, j;
element temp;
if(*n < 2){
fprintf(stderr, "The deap is empty\n");
deap[0].key = INT_MAX;
return deap[0];
}
deap[0] = deap[2];
temp = deap[(*n)--];
for(i = 2; i * 2 <= *n; deap[i] = deap[j], i = j){
j = i * 2;
if(j + 1 <= *n){
if(deap[j].key > deap[j + 1].key)
j++;
}
}
modified_deap_insert(deap, i, temp);
return deap[0];
}
9.3 Leftist Trees