유튜브 영상 내용을 정리한 포스팅 입니다!!
노션이 더 가독성이 좋으니 되도록 노션으로 봐주세요!
👩🏻💻 노션 링크
📹 참고 유튜브 영상
삽입/삭제 시 주로 4번,5번 속성을 위반하며 이들을 해결하려고 구조를 바꾸다 보면 자연스럽게 트리의 균형이 잡히게 된다.
<이진탐색트리 삽입 방식>
1. Root에서 시작합니다.
2. 삽입 값을 루트와 비교합니다. 루트보다 작으면 왼쪽으로 재귀하고 크다면 오른쪽으로 재귀합니다.
3. 리프 노드에 도달한 후 노드보다 크다면 오른쪽에 작다면 왼쪽에 삽입합니다.
삽입하는 노드는 항상 red다!!!!!
( ⇒ 삽입한 후에도 5번 속성을 만족하기위해 )
삽입 후4번 속성을 위반하였을 때, 구조를 바꾸게 되면 이진탐색트리의 특징이 무너진다. ⇒ 구조를 바꾸면서도 이진탐색트리의 특징을 유지시키는 방법은 회전이다.
✔️ case 3)
부모와 할아버지의 색을 바꾼 후, 할아버지 기준으로 오른쪽(왼쪽)으로 회전한다.
✔️ case 2)
부모를 기준으로 왼쪽(오른쪽)으로 회전한 뒤 3번 케이스 방식으로 해결
✔️ case 1)
부모와 삼촌을 black으로 바꾸고 할아버지를 red로 바꾼 뒤 할아버지에서 다시 확인을 시작한다.
삭제되는 색을 통해 속성 위반 여부 확인
삭제하려는 노드의 자녀가 없거나 하나라면 삭제되는 색 = 삭제되는 노드의 색
삭제하려는 노드의 자녀가 둘이라면 삭제되는 색 = 삭제되는 노드의 successor의 색
▶️ 삭제되는 색이 red라면 어떠한 속성도 위반하지 않는다
▶️ 삭제되는 색이 black이라면 2번 4번 5번 속성을 위반할 수 있다
2번 속성 위반 해결하기
→ 루트 노드를 black으로 바꾸면 된다
5번 속성 위반 해결하기
→ 5번 속성을 다시 만족시키기 위해 삭제된 색의 위치를 대체한 노드에 extra black을 부여한다
→ extra black을 부여받은 노드는 doubly black이 되거나 red-and-black이 된다
(삭제 되는 색이 black일 때 특수한 상황을 제외하면 5번 속성을 항상 위반하게 된다.)
⭐️extra black의 역할⭐️
경로에서 black의 수를 카운트 할 때 extra black은 하나의 black으로 카운트 된다.
→ doubly black 발생 (extra black이 부여된 black 노드)
→ red and black 발생 (extra black이 부여된 red 노드)
2-1. red-and-black 해결하기
red-and-black을 black으로 바꾸면 해결!!!
2-2. doubly black 해결하기
case를 분류할 때의 기준은 doubly black의 형제의 색과 그 형제들의 자녀들의 색
✔️ case 4)
doubly black의 오른쪽 형제가 black & 그 형제의 오른쪽 자녀가 red일 때
→ 그 red를 doubly black 위로 옮기고 옮긴 red로 extra black을 전달해서 red-and-black으로 만들면!!!!! red-and-black을 black으로 바꿔서 해결
⇒ 오른쪽 형제는 부모의 색으로, 오른쪽 형제의 오른쪽 자녀는 black으로, 부모는 black으로 바꾼 후에 부모를 기준으로 왼쪽으로 회전하면 해결
✔️ case 3)
doubly black의 오른쪽 형제가 black & 그 형제의 왼쪽 자녀가 red & 그 형제의 오른쪽 자녀는 black일 때
→ doubly black의 형제의 오른쪽 자녀가 red가 되게 만들어서 이후엔 case4를 적용하여 해결
⇒ E 위치에 red가 오도록 만들기 위해 C와 D의 색을 바꾼 후에 D를 기준으로 오른쪽으로 회전
✔️ case 2)
doubly black의 형제가 black & 그 형제의 두 자녀 모두 black일 때
→ B가 red-and-black이 됐다면 black으로 바꿔주면 상황은 종료되지만 B가 doubly black이 됐다면 B가 루트 노드라면 black으로 바꿔서 해결, 아니라면 case 1,2,3,4 중에 하나로 해결
⇒ doubly black과 그 형제의 black을 모아서 부모에게 전달해서 부모가 extra black을 해결하도록 위임한다
✔️ case 1)
doubly black의 형제가 red일 때
→ 부모와 형제의 색을 바꾸고 부모를 기준으로 왼쪽(오른쪽)으로 회전한 뒤 doubly black을 기준으로 case 2, 3, 4 중 하나로 해결
D를 black으로 만들기 위해서 B와 D 색상을 바꿔준다. 그리고 B를 기준으로 왼쪽으로 회전한다.
이 상태에서 다른 case를 적용
N = 트리의 노드 수
avg | worst | |
---|---|---|
insert | O(logN) | O(logN) |
delete | O(logN) | O(logN) |
search | O(logN) | O(logN) |
참고자료
[정글] 레드블랙트리 동작 (Red Black Tree) - Insert 편
[WEEK 05] C - 레드-블랙 트리
C언어로 구현하는 | 레드블랙트리
Red-Black Tree