Skip to content

문제 4 · 좌향 힙 병합

문제 4 [4점]

아래 두 좌향 힙leftist heap의 병합 결과를 그리시오.

병합할 두 좌향 힙
병합 대상인 두 좌향 힙(왼쪽 루트 4, 오른쪽 루트 6)
풀이 및 해설

좌향 힙 병합 규칙

좌향 힙은 각 노드의 널 경로 길이null path length, npl (그 노드에서 자식이 하나 이하인 노드까지의 최단 거리)에 대해, 항상 npl(왼쪽)npl(오른쪽) 을 만족하는 최소 힙이다. merge(H1, H2)는 다음을 재귀적으로 수행한다.

  1. 두 루트 중 작은 값을 새 루트로 삼는다(여기서는 4<6 이므로 4).
  2. 작은 루트의 오른쪽 서브트리와 나머지 힙을 재귀적으로 병합한다.
  3. 병합 후 자식의 npl 조건이 깨지면 왼·오른쪽 자식을 교환하고, npl 값을 갱신한다.

병합 과정

  • 4<6 → 루트는 4. 4의 오른쪽(루트 8)과 힙(루트 6)을 병합.
  • 6<86. 6의 오른쪽(7)과 힙(루트 8_A)을 병합.
  • 7<87. 7의 오른쪽(NULL)과 8_A를 병합하면 8_A. npl 조건 위배로 7의 자식을 교환 → 7의 왼쪽에 8_A.
  • 되돌아오며 각 노드에서 npl을 확인해 필요 시 자식을 교환한다. 루트 6, 루트 4에서는 좌우 npl이 같아 교환이 없다.

병합 결과

text
                4
             /     \
           19       6
          /  \     / \
         27  20   8   7
         /       /    |
        43      14    8
                      |
                      12
                     /  \
                    15   25

각 노드에서 최소 힙 순서(부모 ≤ 자식)와 좌향 성질(npl 왼쪽 ≥ 오른쪽)이 모두 성립함을 확인할 수 있다. 루트의 널 경로 길이는 npl(4)=2 이다.

병합 후 루트=4,루트의 npl=2

👉 실습(C++)에서 확인하기

PDF