Skip to content

문제 4 · 좌향 힙 병합

문제 4 [4점]

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

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

좌향 힙 병합 규칙

좌향 힙은 각 노드의 널 경로 길이null path length, npl 에 대해 항상 npl(왼쪽)npl(오른쪽) 을 만족하는 최소 힙이다. merge는 재귀적으로 (1) 두 루트 중 작은 값을 새 루트로 삼고, (2) 그 오른쪽 서브트리와 나머지 힙을 병합한 뒤, (3) 필요하면 자식을 교환하고 npl을 갱신한다.

병합 과정

  • 3<4 → 루트는 3. 3의 오른쪽(16)과 힙(루트 4)을 병합.
  • 4<164. 4의 오른쪽(12)과 힙(루트 16)을 병합.
  • 12<1612. 12의 오른쪽(NULL)과 16을 병합하면 16이 12의 오른쪽에 붙는다. 12에서 좌우 npl이 같아 교환 없음.
  • 되돌아오며 4에서도 좌우 npl이 같아 교환 없음.
  • 마지막으로 루트 3에서 왼쪽(10, npl=1)보다 오른쪽(4, npl=2)의 npl이 더 커서 좌향 성질이 깨지므로 자식을 교환한다.

병합 결과

text
                 3
            /         \
           4          10
         /   \        / \
        11   12     27   28
       /  \  / \
      32 41 22  16
      /     /   /
     50    33  33

즉 루트 3의 왼쪽에 4의 서브트리, 오른쪽에 10의 서브트리가 온다. 각 노드에서 최소 힙 순서좌향 성질(npl 왼쪽 ≥ 오른쪽)이 모두 성립한다.

병합 후 루트=3,루트의 npl=2,루트의 좌·우 자식=4, 10

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

PDF