최대 힙 삭제연산에 대하여
가람
element del_max_heap(HeapType *h)
{
int parent,child;
element item,temp;
item = h-heap[1];
temp = h-heap[(h-heap_size)--];
parent = 1;
child = 2;
while(child = h-heap_size){
if(child h-heap_size) &&
(h-heap[child].key h-heap[child+1].key)
child++;
if(temp.key = h-heap[child].key) break;
h-heap[parent] = h-heap[child];
parent = child;
child *= 2;
}
h-heap[parent] = temp;
return item;
}
※폰으로 써서 오타가 많을수도 있습니다.
삭제를 할 경우 맨위 루트노드를 삭제한 후 말단노드를 루트노드에 놓은 후 히프를 재구성하는 개념적인건 알겠는데 위 코드를 보면서 하니 해보는데 이해가 잘 안가서요..
4
/ \
3 2
/
1
라는 트리가 있을때 삭제연산을 수행합니다.
그러면 while문에서
child = 2 = h-heap_size = 4 를 만족하기 때문에 그 밑에 있는 코드를 수행합니다.
if((26)&&(3 2)) 이프문조건이 만족되지 않아 child++을 하지않습니다.
if(1 = 3) 이 또한 조건이 만족되지않으므로 break를 하지 않습니다.
h-heap[parent] = h-heap[child]; 에 의해
3
/ \
3 2
/
ㅣ
이렇게되고
부모는 2 자식은 4 가됩니다.
while문 조건이 만족되지않을때까지 안에 있는 이프문이 계속해서 돌고 그 후 맨밑 2줄의 코드가 시행되는건데 개념적으로 삭제되는 과정이랑 결과 트리가 다릅니다...
제가 코드를 잘못보고 있는거 같은데
뭐가 잘못 되었는지 알려주세요
또한 위 코드대로 변화하는 과정써주실수 있는 분 부탁드립니다...