Red Black Tree란?
이진 탐색 트리의 한 종류로 스스로 균형을 잡는 밸런스 트리입니다.
BST(이진탐색트리)의 worst case의 단점을 개선 - 이진 탐색 트리는 최악일 경우 O(N)의 시간복잡도를 가짐
RB Tree의 속성
- 모든 노드는 red 혹은 black이다.
- 루트 노드는 black이다.
- 모든 nil 노드는 black 컬러를 가진다. ( RB 트리에서 리프 노드는 nil 노드)
- red의 자녀들은 반드시 black. 즉, red가 연속적으로 존재할 수 없다. black은 가능!
- 임의의 노드에서 자손 nil 노드들까지 가는 경로들의 black 수는 같다. (자기 자신은 카운트에서 제외함)
노드 x의 black height = 임의의 노드에서 자손 nil 노드들까지 가는 경로들의 black 수
5번 속성을 만족해야 성립하는 개념
색을 바꾸면서도 5번 속성 유지하기
RB 트리가 5번 속성을 만족하고 있고, 두 자녀가 같은 색을 가질 때
부모와 두 자녀의 색을 바꿔도 5번 속성은 여전히 만족한다.
삽입
과정
삽입 전에는 속성을 모두 만족한 상태
삽입 방식은 이진탐색트리와 동일
삽입 후 RB 트리 위반 여부 확인
속성을 위반했다면 재조정
속성을 다시 만족
! 삽입하는 노드는 항상 red
nil 노드는 black 고정
2번 속성 위반시 루트를 블랙으로 바꿔주면 됨
>> 왜 새로 삽입하는 노드는 red인가?
삽입 후에도 5번 속성을 만족하기 위해서
임의의 조상 노드에서 nil까지 블랙 수를 셀 때,
블랙을 삽입하면 특정 루트만 블랙이 늘어남 - 레드를 삽입할 경우 5번 속성을 만족할 수 있음
속성 위반 시 구조를 바꿔야하는데 구조를 바꾸면서 BST를 유지하려면 회전을 해야한다.
삽입 후 4번 속성 위반했을 때
case 3.
삽입된 red 노드가 부모의 왼쪽 자녀&
부모가 red면서 할아버지의 왼쪽 자녀와 부모의 형제가 black이라면 부모와 할아버지의 색을 바꾸고 할아버지 기준으로 오른쪽으로 회전한다.
case 2.
case3 와 다른 점은 삽입한 노드부터 할아버지 노드까지 경로가 꺾였다
(삽입 노드가 부모의 오른쪽 자녀면서 부모가 red && 할아버지의 왼쪽 자녀&&삼촌이 black이라면)
꺾인 부분을 펴주고 case3처럼 만들어줌
-> 부모를 기준으로 왼쪽으로 회전한 뒤 case3 방식으로 해결
case 1.
삽입 노드의 부모도 red & 삼촌도 red라면
-> 부모와 삼촌을 balck으로 바꾸고 할아버지를 red로 바꾼 뒤 할아버지에서부터 다시 확인을 시작한다
삭제
삭제 전에는 RB트리 속성을 만족한 상태임을 가정
삭제 방식은 BST와 동일
삭제 후 RB 트리 속성 위반 여부 확인
RBㅡ트리 속성을 위반했다면 재조정
RB 트리 속성을 다시 만족
nil 제외한 삭제하려는 노드의 자녀가 없거나 하나라면 삭제되는 색 = 삭제되는 노드의 색이다.
삭제하려는 노드의 자녀가 둘이라면 삭제되는 색 = 삭제되는 노드의 succecor 의 책
속성 위반 여부 확인는 삭제되는 색을 통해서 할 수 있다.
삭제되는 색이 red라면 어떠한 속성도 위반하지 않는다!
삭제되는 색이 black이라면 2,4,5번 속성을 위반할 수 있다.
- 2번 위반 시
= 새로 루트가 된 노드를 black으로 바꿔주면 끝
- 5번 위반 시
= 삭제된 색의 위치를 대체한 노드에 extra black 부여
경로에서 black 수를 카운트 할 때 extra black은 하나로 카운트 된다.
extra black을 부여받는 노드가 블랙일 때 -> doubly black // 레드일 때 -> red-and-black
extra black 해결하기
red-and-black -> 그냥 black으로 바꾸면 해결
doubly black 해결하기
case 4.
doubly black의 오른쪽 형제가 black이면서 -> D
그 형제의 오른쪽 자녀가 red일 때 -> E
doubly black 위 노드를 red로 만들고 extra black을 전달
1. D의 블랙을 자식들로 전파 / E는 블랙이 되고 다른 자녀 C는 레드->블랙 또는 doubly black이 된다.
2. D의 부모인 B와 색을 바꾼다.
3. 부모 B를 기준으로 왼쪽으로 회전한다.
4. doubly black을 red가 된 B로 전해준다.
요약)
오른쪽 형제는 부모의 색으로, 오른쪽 형제의 오른쪽 자녀는 black으로 부모는 블랙으로 바꿈
부모를 기준으로 왼쪽으로 회전하면 해결
case 3.
오른쪽 형제가 black이고 형제의 왼쪽 자녀가 red&오른쪽 자녀가 black 일 때
-> doubly black의 형제의 오른쪽 자녀가 red가 되게 만들어서 이후엔 case 4를 적용해 해결
먼저 왼쪽 자녀와 형제의 색을 바꾸고 형제를 기준으로 오른쪽으로 회전,
이후는 case 4
형제는 부모의 색으로 바꾸고 부모와 오른쪽 자녀를 black 바꾼 후 B 를 기준으로 왼쪽으로 회전해서 해결
case 2.
doubly black의 형제가 black이고 그 형제의 두 자녀 모두 black일 때
doubly black과 그 형제의 black을 모아 부모에게 전달! 부모가 extra black을 해결하도록 위임한다.
부모는 red-and-black 또는 doubly black이 된다.
red-and-black이면 블랙으로 바꿔주면 해결
doubly black이면 case 1,2,3,4 중에 해결 - 만약 루트면 그냥 black으로 해결
case 1.
형제가 red 일 때 형제를 black으로 만든 후 case 2,3,4 중에서 해결
먼저 부모(black)를 기준으로 왼쪽으로 회전/ 그 전에 먼저 부모와 형제의 색을 교환
회전으로 doubly black의 형제가 black이 되었으므로 case 2,3,4 중에 해결책을 찾음
'알고리즘' 카테고리의 다른 글
[C언어] RB 트리 구현(2) - 삭제, 탐색 (1) | 2024.02.18 |
---|---|
[C언어] RB 트리 구현(1) - 삽입 (0) | 2024.02.07 |
C언어) LinkedList, 연결리스트에 대해서 (2) | 2024.01.26 |
LCS (Longest Common Subsequence) (2) | 2024.01.25 |
최소 신장 트리란? (0) | 2024.01.21 |