문제 12 · 레드-블랙 트리의 재귀적 제거
문제 12 [4점]
제거(remove) 연산에서 같은 성격의 재귀적 작업이 세 번 이상 발생하는 레드-블랙 트리red-black tree 예시를 만드시오(빗금 등으로 레드 표시해도 좋음, 어떤 노드가 제거되는지 표시 필요).
풀이 및 해설
레드-블랙 트리에서 검은 노드를 삭제하면 그 자리에 "이중 흑색(double black)" 결손이 생깁니다. 이때 형제가 검은색이고 형제의 두 자식도 모두 검은색이면, 형제를 빨간색으로 칠하고 결손을 부모로 한 단계 위로 밀어 올리는(case 2) 처리를 합니다. 이 처리는 위로 올라가며 같은 성격으로 반복될 수 있습니다.
이 반복이 3번 이상 일어나게 하려면, 모든 노드가 검은색인 완전(포화) 이진 트리를 만들고 가장 깊은 잎을 제거하면 됩니다. 예시로 15개 노드(높이 3)를 모두 검은색으로 두고, 키 1(가장 왼쪽 잎)을 제거합니다.
8(B)
/ \
4(B) 12(B)
/ \ / \
2(B) 6(B) 10(B) 14(B)
/ \ / \ / \ / \
[1] 3 5 7 9 11 13 15 (모두 검은색, [1]을 제거)이 트리는 모든 경로의 검은 높이가 같으므로 유효한 레드-블랙 트리입니다. 검은 잎 1을 제거하면 결손이 위로 전파됩니다.
1자리에 이중 흑색 결손 → 형제3(검), 두 자식(nil) 모두 검 →3을 빨강으로, 결손을 부모2로 올림.2에서 결손 → 형제6(검), 자식5,7모두 검 →6을 빨강으로, 결손을 부모4로 올림.4에서 결손 → 형제12(검), 자식10,14모두 검 →12를 빨강으로, 결손을 부모8(루트)로 올림.- 루트에 도달 → 루트를 검은색으로 두고 종료.
같은 성격의 재귀적 처리(형제를 빨강으로 칠하고 결손을 위로 전파)가 정확히 3번 일어났습니다.
제거 후 트리(전파된 곳의 형제 3, 6, 12가 빨강이 됨):
8(B)
/ \
4(B) 12(R)
/ \ / \
2(B) 6(R) 10(B) 14(B)
\ / \ / \ / \
3(R) 5 7 9 11 13 15(높이를 4 이상으로 키우면 전파 횟수도 그만큼 늘어납니다.)