부모가 자식들보다 큰 트리
완전이진트리인 max tree
부모가 자식들보다 작은 트리
완전이진트리인 min tree
heap은 array로 구현!
그래야 장점이 살아남ㅇㅇ
인덱스를 통해 parent child O(1)에 바꿀 수 있음
void insert_max_heap(element item, int *n) {
/* insert item into a max heap of current size *n */
int i;
if(HEAP_FULL(*n)) {
fprintf(stderr, "The heap is full.\\n");
exit(1);
}
i = ++(*n);
while((i != 1) && (item.key > heap[i/2].key)) {
heap[i] = heap[i/2]; // 부모걸 가져옴
i /= 2;
}
heap[i] = item; // 최종 위치에 삽입
}
0번째 인덱스는 비우는 듯
끝 노드를 루트로 가져오고 insertion 로직과 비슷하게 위치 재설정
위치 재설정 시 자식노드들 중 더 큰 것과 swap
element delete_max_heap(int *n) {
/* delete element with the highest key from the heap */
int parent, child;
element item, temp;
if(HEAP_EMPTY(*n)) {
fprintf(stderr, "The heap is empty");
exit(1);
}
/* save value of the element with the largest key */
item = heap[1];
/* use the last element in the heap to adjust heap */
temp = heap[(*n)--];
parent = 1;
child = 2;
while(child <= *n) {
/* find the larger child of the current parent */
if((child < *n) && (heap[child].key < heap[child+1].key)) child++;
if(temp.key >= heap[child].key) break;
/* move to the next lower level */
heap[parent] = heap[child];
parent = child;
child *= 2;
}
heap[parent] = temp;
return item;
}