Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 우선순위 큐의 추출 POP
- int pop(priorityQueue *root) {
- if (root->count <= 0) return -9999;
- // 추출할 대상이 더이상 없을경우 오류를 출력
- int res = root->heap[0];
- // 반환할 최상단 루트의 값을 res 변수에 담습니다.
- root->count--;
- // 최산단 루트값이 하나 빠짐으로 count 값도 같이 하나 감소시킵니다.
- root->heap[0] = root->heap[root->count];
- // 최상단 루트에는 맨 마지막 노드값이 들어가도록 합니다.
- // 이제 최상단 루트와 맨마지막 노드값의 위치가 변경되었으니 하양식으로 data값을
- // 확인해가며 최대힙을 구성해가면 됩니다.
- int now = 0, leftChild = 1, rightChild = 2;
- // now 는 최상단 루트의 위치
- // leftChild 최상단 루트의 자식값의 왼쪽
- // rightChild 최상단 루트의 자식값의 오른쪽
- int target = now;
- // 새 원소를 추출한 이후에 하향식으로 힙을 구성합니다.
- while (leftChild < root->count) {
- if (root->heap[target] < root->heap[leftChild]) target = leftChild;
- // 현재 부모값 보다 왼쪽의 자식값이 더 크면 target 에 자식값을 참조합니다.
- if (root->heap[target] < root->heap[rightChild] && rightChild < root->count) target = rightChild;
- // 현재 부모값 보다 외른쪽 자식값이 더 크고 rightChild index 값보다 현재 index 값이 더크면 (index 위치 벗어나지 안도록)
- // target 에 자식값을 참조합니다.
- if (target == now) break; // 더 이상 내려가지 않아도 될 때 종료
- else {
- swap(&root->heap[now], &root->heap[target]);
- // 현재 값과 자식값의 자리를 바꿔준다.
- now = target;
- // 다음 트리 검사대상을 now에 참조시킵니다.
- // 그러면 트리를 하양식으로 내려가면서 검사를 계속해서 반복합니다.
- leftChild = now * 2 + 1;
- rightChild = now * 2 + 2;
- // 자식값 index 또한 다음 index 트리로 이동시켜줍니다.
- }
- }
- return res;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement