본문 바로가기
TIL (Today I Learned)/알고리즘

[알고리즘] RB Tree개념과 삽입 동작 원리 #1

by 둥굴프 2022. 11. 26.
한국외대 '신찬수' 교수님과 '쉬운 코드'님의 강의 자료를 참고하였습니다.

 

개념을 공부하고, 시뮬레이터를 활용하여 노드의 동작 원리를 이해한다.

하단의 링크는 rbtree visualization을 확인할 수 있는 링크이다. 참고하여 학습을 진행한다.

https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

 

Red/Black Tree Visualization

 

www.cs.usfca.edu

 

#1 레드블랙 트리 기본 개념과 특징

1. 레드블랙 트리 개념

1. 이진 탐색 트리(BST)의 한 종류

2. 스스로 균형 잡는 트리

3. BST의 worst case의 단점을 개선 : worst case = 한 방향으로 편향된 이진탐색 트리 > O(N)

4. 모든 노드는 red 혹은 black

 

위 3번 특징을 개선하기 위해서 2번 특징이 존재.
최악의 경우에도 O(logN).

 

 

2. red-black 트리 속성

1. 모든 노드는 red 혹은 black

2. 루트 노드는 black

3. 모든 nil(leaf) 노드는 black

4. red의 자녀들은 black or red가 연속적으로 존재할 수 없다.

5. 임의의 노드에서 자손 nil 노드들까지 가는 경로들의 black 수는 같다.

(자기 자신은 카운트에서 제외)

 

nil 노드란?

- 존재하지 않음(NULL)을 의미하는 노드

- 자녀가 없을 떄 자녀를 nill 노드로 표기

- 값이 있는 노드와 동등하게 취급

- RB트리에서 leaf 노드는 nil 노드

 

#5 속성에서 나오는 새로운 개념 : 노드 x의 black height

- 노드 x에서 임의의 자손 nil 노드까지 내려가는 경로에서의 black 수

(자기 자신은 카운트에서 제외)

- #5 속성을 만족해야 성립하는 개념

 

색을 바꾸면서도 #5 속성 유지하기

RB 트리가 #5 속성을 만족하고 있고 두 자녀가 같은 색깔을 가질 때

부모와 두 자녀의 색을 바꿔줘도 #5 속성은 여전히 만족한다.

(나중에 삽입 및 삭제에 사용되는 개념)

 

 

3. RB 트리는 어떻게 균형을 잡는가?

 

삽입/삭제 시 주로 #4, #5를 위반한다.

이를 해결하려고 구조를 바꾸다 보면 자연스럽게 트리의 균형이 잡히게 된다.

 

 

#2 레드블랙 트리의 삽입 방식

 

0. 삽입 전 RB 트리 속정 만족한 상태

1. 삽입 방식은 일반적인 BST와 동일

2. 삽입 후 RB 트리 위반 여부 확인

3. RB 트리 속성을 위반했다면 재조정

4. RB 트리 속성을 다시 만족

 

1. 삽입 과정

삽입하는 노드의 색은 항상 red

 

2. 삽입 후 #4 속성 위반 case.3

 

insert(50)

- 두 nil 노드의 색은 black으로 고정한다. #3 속성 만족

- 만약 루트노드라면 현재 상태가 #2 속성을 위반한 상태 > 루트 노드를 black으로 바꿔준다.

첫 삽입 - root노드는 black

insert(20)

모든 속성 만족

 

왜 새로 삽입하는 노드는 red인가?

- 삽입 후에도 #5 속성을 만족하기 위해

 

insert(10)

#4 위반, 선형적 형태

- #4 속성 위반 해결 방법

- red가 한 쪽으로 몰려 있으니 red하나를 반대편으로 옮겨 준다면?

*구조를 바꿔준 뒤에 BST의 특징 도한 유지되어야 한다.

- 구조를 바꾸면서도 BST의 특징을 유지시키는 방법은 회전이다.

 

'50과 20의 색깔을 바꿔준 다음 회전을 시켜도 되고, 회전을 시킨 다음에 색깔을 바꿔도 된다.'

 

모든 속성 만족

 

 

조건

(1) 삽입된 red 노드가 부모의 왼쪽* 자녀

(2) 부모도 red고 할아버지의 왼쪽* 자녀

(3) 삼촌(=부모의 형제)은 black

즉, '선형의 노드 형태'일 때 성립하는 case.3이다.

해결방법

부모와 할아버지의 색을 바꾼 후 할아버지 기준으로 오른쪽*으로 회전한다.

* 오른쪽 왼족 바꿔도 성립

 

3. 삽입 후 #4 속성 위반 case.2

 

모든 속성을 만족

insert(40)

#4 위반, 삼각 형태.

위 경우와 다르게 이러한 형태는 자식과 부모, 할아버지 노드가 꺾여있는 것을 확인할 수 있다.

1. 20을 기준으로 왼족으로 회전한다.

회전 후에도 #4 외의 속성들을 만족하며 이제 case.3의 형태가 된다.

case.3의 형태가 된 모습

2. 40과 50의 색을 바꾼다.

3. 50을 기준으로 오른족으로 회전한다.

모든 속성을 만족

조건

(1) 삽입된 red 노드가 부모의 오른쪽* 자녀

(2) 부모도 red고 할아버지의 왼쪽* 자녀

(3) 삼촌(=부모의 형제)은 black

즉, '선형의 노드 형태'일 때 성립하는 case.2이다.

해결방법

부모를 기준으로 왼쪽*으로 회전한 뒤 case.3의 방식으로 해결

* 오른쪽 왼족 바꿔도 성립

 

4. 삽입 후 #4 속성 위반 case.1

 

모든 속성을 만족

insert(30)

#4 속성 위반

red가 한쪽으로 몰려있지 않아서(=삼촌 red) 옮길 수가 없다.

위에서 한번 소개한 속성의 특징

 

부모(할아버지)와 두 자녀(부모)의 색을 바꾼다.

20이 루트 노드라서 #2 속성을 위반한다.

20을 black으로 바꿔준다.

모든 속성을 만족

조건

(1) 삽입된 red 노드의 부모 red

(2) 삼촌(=부모의 형제)은 red

즉, 부모와 삼촌 노드의 색깔이 red일 때 성립하는 case.1이다.

해결방법

부모와 삼촌을 black으로 바꾸고 할아버지를 red로 바꾼뒤 할아버지에서 다시 확인을시작한다.

 

🤔 할아버지가 루트노드인 경우, 할아버지의 부모노드가 red일 경우 등 다시 확인 필요.

 

 

#3 레드블렉 트리 삽입 예제

모든 속성 만족

insert(40) - case.2 발생

case.1 발생
모든 속성 만족

insert(35) - case.2 발생

case.2 발생
case.3으로 만들어준다.
모든 속성 만족

insert(25) - case.1 / case.2 / case.3

case.1
case.2
case.3
모든 속성 만족

 

 

글을 마치며,

처음 rbtree를 마주했을 때는 이해가 잘 안됐는데, 시뮬레이터를 활용하여 학습하니 도움이 됐다.

해당 주소를 알려준 Mr.한에게 감사를 표한다.

다음 포스팅에서는 rbtree의 삭제에 대해 학습한다.

 

 

 

긴 글 읽어주셔서 감사드립니다.

22.11.26

'TIL (Today I Learned) > 알고리즘' 카테고리의 다른 글

[알고리즘] Big O  (1) 2023.03.16
[알고리즘] RB Tree삭제 동작 원리 #2  (0) 2022.11.26

댓글