[C] 레드블랙 트리 (삭제)

방법이있지·2025년 6월 20일

[정글 4-8주차] C언어

목록 보기
20/26
post-thumbnail

제 블랙핑크 최애곡은 셧다운, 레드벨벳 최애곡은 피카부입니다

참고 자료

본 글은 간결성을 위해 엄밀한 증명, 검증은 생략했습니다.

한마디로 나중에 C언어로 직접 구현할 때, 기억해야 할 부분만 적어 놨습니다.

추가적인 부분 (e.g., 왜 이렇게 삭제를 해도 레드블랙 트리의 성질이 유지되는지...)이 궁금하시면 참고 자료 시청을 권해 드립니다.

레드블랙 트리에서의 삭제

  • 삭제 방식은 일반적인 BST와 동일
  • 삭제 후 레드블랙 트리의 속성을 위반한 경우, 속성을 만족하게끔 재조정
  • 속성 위반 여부를 파악할 때, 어떤 색이 삭제됐는지 확인하는 것이 중요함

삭제된 색 확인하기

  • 이때 자식을 셀 때, Nil 노드를 포함하지 않음
    • 유효한 값을 갖는 자식만 세기

  • 삭제된 노드의 자식이 2개일 때
    • 실제로 삭제되는 색은, 삭제되는 노드의 Successor의 색임을 기억할 것
    • Successor는 삭제되는 노드의 오른쪽 서브트리의 최솟값 노드

  • 삭제되는 노드 자리의 값이 Successor의 값으로 바뀌고, Successor 노드가 삭제되는 방식이기 때문

  • 삭제된 노드의 자식이 없거나 1개인 경우, 노드 자기 자신이 삭제됨

Red가 삭제됐을 때

  • 아무 속성도 위반되지 않음
  • 1번: 모든 노드는 Red 또는 Black, 3번: 모든 Nil 노드는 Black
    • 당연히 위반될 리가 없음
  • 2번: 루트 노드는 Black /
    • Red 노드가 삭제됐으니, 루트 노드 / Nil 노드가 삭제됐을 리가 없음
  • 4번: Red 노드의 자식은 무조건 Black 노드
    • 삭제된 노드는 Red이므로, 삭제된 노드의 자식은 무조건 Black
    • 즉 Red 부모가 새로운 Red 자식을 가지는 상황은 있을 수 없음
  • 5번: 특정 노드 x에서 어느 Nil 노드로 내려가든, 경로에서 마주치는 Black 노드 수는 동일
    • Red가 삭제돼도 Black의 수는 달라지지 않음

Black이 삭제됐을 때

  • 아래 그림과 같이, 일부 속성이 위반될 수 있음

(2번) 루트 노드가 Red가 됐을 때

  • 단순히 루트 노드를 Black으로 변경하면 됨

(5번) Black Height가 일정하지 않을 때

  • 일반적으로 Black 노드를 삭제하면 경로 중 Black의 개수가 달라질 수밖에 없으므로, 5번을 위반하게 됨
  • 삭제된 노드의 위치를 대체한 노드의 색을 확인
  • (4번)은 보통 (5번)과 함께 위반됨

  • Red인 경우, 삭제 위치의 노드를 Black으로 변경

  • Black인 경우, 삭제 위치의 새로운 노드를 Doubly Black으로 지정함
    • Black Height를 계산할 때, 2개의 Black 노드로 간주됨
    • 물론 정상적인 노드가 아니므로, 아래 과정을 통해 해결해야 함

Doubly Black 없애기

  • DB의 형제의 색과, 형제의 자녀들의 색에 따라 해결법이 달라짐
    • 본 글은 과정 위주로만 서술했습니다. 원리에 입각한 설명이 궁금하시면, 위 참고영상 시청을 권장드립니다

DB가 왼쪽 자식인 경우

오른쪽 형제형제의 왼쪽 자녀형제의 오른쪽 자녀Case 몇번?
Black상관없음RedCase 4
BlackRedBlackCase 3
BlackBlackBlackCase 2
Red상관없음상관없음Case 1

DB가 오른쪽 자식인 경우

왼쪽 형제형제의 왼쪽 자녀형제의 오른쪽 자녀Case 몇번?
BlackRed상관없음Case 4
BlackBlackRedCase 3
BlackBlackBlackCase 2
Red상관없음상관없음Case 1

Case 4

조건 1: DB의 오른쪽 형제가 Black이며 형제의 오른쪽 자녀가 Red일 때

  • (1) 색 바꾸기
    • 오른쪽 형제는 부모의 색으로
    • 오른쪽 형제의 오른쪽 자녀는 black으로
    • 부모는 black으로
  • (2) 부모를 기준으로 좌회전
  • (3) DB를 일반 black으로 되돌리면 해결

조건 2: DB의 왼쪽 형제가 Black이며 형제의 왼쪽 자녀가 Red일 때

  • (1) 색 바꾸기
    • 왼쪽 형제는 부모의 색으로
    • 왼쪽 형제의 왼쪽 자녀는 black으로
    • 부모는 black으로
  • (2) 부모를 기준으로 우회전
  • (3) DB를 일반 black으로 되돌리면 해결

Case 3

조건 1: DB의 오른쪽 형제가 Black, 형제의 왼쪽 자녀가 Red, 형제의 오른쪽 자녀가 Black일 때

  • (1) 오른쪽 형제와, 형제의 왼쪽 자녀의 색 바꾸기
  • (2) 오른쪽 형제 기준 우회전
  • (3) 이후 형제의 오른쪽 자녀가 Red가 되므로, Case 4를 사용해 해결 가능

조건 2: DB의 왼쪽 형제가 Black, 형제의 왼쪽 자녀가 Black, 형제의 오른쪽 자녀가 Red일 때

  • (1) 왼쪽 형제와, 형제의 오른쪽 자녀의 색 바꾸기
  • (2) 왼쪽 형제 기준 좌회전
  • (3) 이후 형제의 왼쪽 자녀가 Red가 되므로, Case 4를 사용해 해결 가능

Case 2

조건: DB의 형제가 Black, 형제의 두 자식이 모두 Black일 때

  • (1) DB를 일반 Black으로 되돌리고, 형제를 Red로 변경
  • (2a) 부모가 Red면, Black으로 변경
  • (2b) 부모가 Black이면, 부모는 Doubly Black이 되어 버림
    • 부모가 루트 노드면, 단순히 다시 Black으로 바꿔 해결
    • 부모가 루트가 아니면, Case 1 ~ 4 중 알맞은 해결법으로 해결

Case 1

조건 1: DB의 오른쪽 형제가 Red일 때

  • (1) 부모와 형제의 색 바꾸기
  • (2) 부모를 기준으로 좌회전
  • (3) 형제가 Black이 되므로, 이후 Case 2 ~ 4을 사용해 해결 가능

조건 2: DB의 왼쪽 형제가 Red일 때

  • (1) 부모와 형제의 색 바꾸기
  • (2) 부모를 기준으로 우회전
  • (3) 형제가 Black이 되므로, 이후 Case 2 ~ 4을 사용해 해결 가능

실제 삭제 예제

Red가 삭제됐을 때

Black이 삭제됐을 때 -> 삭제 위치가 Red였던 경우

Black이 삭제됐을 때 -> 삭제 위치가 Black이였던 경우

  • 이 경우 Doubly Black이 생겼으므로 해결해야 함

Case 4

Case 3

Case 2

Case 1

profile
뭔가 만드는 걸 좋아하는 개발자 지망생입니다. 프로야구단 LG 트윈스를 응원하고 있습니다.

0개의 댓글