🏛️ Data Structure
Red-Black Tree
정의
노드에 색상을 추가하여 색상 규칙을 기준으로 트리의 균형을 유지
특징
- 이진 탐색 트리
- 스스로 균형 잡는 트리
- 삽입, 삭제 시 4, 5번 규칙을 어기게 되는데, 이를 해결하려고 구조를 바꾸면 자연스럽게 트리의 균형이 잡힘
시간복잡도
𝑂(log𝑛)
규칙
- 노드는 레드 혹은 블랙 중의 하나이다.
- 루트 노드는 블랙이다.
- 모든 리프 노드(NIL)들은 블랙이다.
- 레드 노드의 자식 노드들은 언제나 블랙이다.
- → 레드 노드가 연속적으로 존재할 수 없다.
- 어떤 노드로부터 시작되어 리프 노드(= NIL)에 도달하는 모든 경로에는 모두 같은 개수의 블랙 노드가 있다.(자기 자신은 카운트 X)
용어
NIL
자녀가 없음을 나타내는 노드
- 값이 있는 노드들과 동등하게 취급
- → 모든 리프 노드(= NIL)들은 블랙이다.
Black Height
5번에서와 같이 노드 x 에서 임의의 자손 NIL 노드까지 내려가는 경로에서의 블랙의 수(자기 자신은 카운트 X)
왼쪽 회전 (Left rotation)
오른쪽 회전 (Right rotation)
CRUD
삽입
- 삽입 전, RB 트리 속성 만족한 상태
- 삽입 방식은 일반적인 BST와 동일
- 삽입 후, RB 트리 위반 여부 확인
- RB 트리 속성을 위반했다면 재조정
- RB 트리 속성을 다시 만족
규칙
- 삽입하는 노드는 항상 레드다.
- 삽입 후에도 5번 규칙을 만족하기 위해(Black Height의 변화가 없음)
Case.1
Case.2
→
이제 Case.3과 같으므로, Case.3처럼 해결
Case.3
삭제
- 삭제 전 RB 트리 속성 만족한 상태
- 삭제 방식은 일반적인 BST와 동일
- 삭제 후 RB 트리 속성 위반 여부 확인
- RB 트리 속성을 위반했다면 재조명
- RB 트리 속성을 다시 만족
삭제되는 노드의 색에 따라
규칙
- 삭제하려는 노드의 유효한 자녀가 없거나 하나라면
- 삭제되는 색 = 삭제되는 노드의 색
- 삭제하려는 노드의 유효한 자녀가 둘이라면
- 삭제되는 색 = 삭제되는 노드의 successor의 색
- successor = 선택한 노드의 오른쪽 서브트리중 가장 작은값을 가지는 노드
- 삭제되는 색이 레드라면
- 어떠한 속성도 위반하지 않는다.
- 삭제되는 색이 블랙이라면
- 2, 4, 5번 규칙을 위반할 수 있다.
2번 위반
루트 노드를 블랙으로 바꾼다.
5번 위반
extra black 부여
- doubly black = extra black이 부여된 black 노드
- Case.1
- Case.2
- Case.3
- Case.4
- Case.6
이제 Case.4와 같은 상황이므로
- red and black = extra black이 부여된 red 노드
- red and black을 black으로 교체