문제 2 · 재귀가 세 번 이상 일어나는 레드-블랙 트리 제거
문제 2 [4점]
제거(remove) 연산에서 같은 성격의 재귀적 작업이 세 번 이상 발생하는 레드-블랙 트리red-black tree 예시를 만드시오(빗금 등으로 레드 표시해도 좋음, 어떤 노드가 제거되는지 표시 필요).
풀이 및 해설
핵심 아이디어
레드-블랙 트리에서 검은 노드를 지우면(또는 검은 노드가 대체되면) 그 경로의 검은 높이가 1 줄어들어 "이중 검정(double black)" 문제가 생긴다. 이때 형제(sibling)가 검은색이고 그 두 자식도 모두 검은색이면, 형제를 빨간색으로 칠하고 이중 검정을 부모로 밀어 올린다. 이 경우(Case 2)는 부모에서 같은 상황이 다시 발생할 수 있어, 루트를 향해 재귀적으로 반복된다. 따라서 이 반복이 3번 이상 일어나는 트리를 만들면 된다.
예시 트리
모든 노드가 검은색인 완전 이진 트리(높이 3, 15개 노드)를 준비한다. 아래에서 [B]는 검정 노드다(빨강 없음 — 완전 균형이면 전부 검정으로 둘 수 있다).
text
8[B]
/ \
4[B] 12[B]
/ \ / \
2[B] 6[B] 10[B] 14[B]
/ \ / \ / \ / \
1 3 5 7 9 11 13 15 (모두 [B])여기서 리프 노드 1[B] 을 제거한다고 하자.
재귀적 상향 전파 과정
- 1번 삭제 → 2의 왼쪽 자리에 이중 검정 발생. 형제는 3[B], 자식 모두 없음(검정) → Case 2: 3을 빨강으로 칠하고 이중 검정을 2로 올림.
- 2가 이중 검정 → 형제는 6[B], 그 자식 5[B], 7[B] 모두 검정 → Case 2: 6을 빨강으로 칠하고 이중 검정을 4로 올림.
- 4가 이중 검정 → 형제는 12[B], 그 자식 10[B], 14[B] 모두 검정 → Case 2: 12를 빨강으로 칠하고 이중 검정을 8(루트)로 올림.
- 8이 루트의 이중 검정 → 그냥 검정으로 흡수하며 종료.
같은 성격의 재귀(형제를 빨강으로 칠하고 이중 검정을 부모로 올리는 작업)가 세 번 반복된 뒤 루트에서 끝난다. 트리를 더 높게 만들면 이 재귀는 트리 높이