
1. 모든 노드는 red 혹은 black
2. 루트 노드는 black

# nil 노드란?
3. 모든 nil(leaf) 노드는 black
4. red의 자녀들은 black or red가 연속적으로 존재할 수 없다.
5. 임의의 노드에서 자손 nil 노드들까지 가는 경로들의 black 수는 같다.(자기 자신은 카운트에서 제외)

RB 트리가 #5 속성을 만족하고 있고 두 자녀가 같은 색을 가질 때 부모와 두 자녀의 색을 바꿔줘도 #5 속성은 여전히 만족한다.
#5. 임의의 노드에서 자손 nil 노드들까지 가는 경로들의 black 수는 같다.(자기 자신은 카운트에서 제외)
삽입/삭제 시 주로 #4, #5를 위반하며 이들을 해결하려고 구조를 바꾸다 보면 자연스럽게 트리의 균형이 잡히게 된다.
#4. red의 자녀들은 black or red가 연속적으로 존재할 수 없다.
#5. 임의의 노드에서 자손 nil 노드들까지 가는 경로들의 black 수는 같다.(자기 자신은 카운트에서 제외)
insert(50)

노드를 삽입할 때 두 nil 노드의 색은 black으로 고정한다. 그러면 자연스럽게 #3 속성을 만족한다.
#3. 모든 nil(leaf) 노드는 black
현재 Red-Black 트리 #2 속성 위반한 상태. 루트 노드를 black으로 바구면 해결~
#2. 루트 노드는 black

삽입 후에도 #5 속성을 만족하기 위해
#5. 임의의 노드에서 자손 nil 노드들까지 가는 경로들의 black 수는 같다.(자기 자신은 카운트에서 제외)

그림에서 위쪽 그림은 RB트리에 nil노드가 하나 나와있는 모양이고 그 아래 그림은 그 nil노드에 red 노드를 삽입하는 것을 보여준다. red를 삽입하면 경로에 black의 노드가 추가되는 것은 아니기 때문에 #5 속성을 만족할 수 있다.

1. insert(30)

이 경우 #4와 #5를 위반했다. #4를 만족시키면서 #5를 유지하려면 10과 50을 black으로 바꾸고 20을 red로 바꾸면 된다.
4. red의 자녀들은 black or red가 연속적으로 존재할 수 없다.
5. 임의의 노드에서 자손 nil 노드들까지 가는 경로들의 black 수는 같다.(자기 자신은 카운트에서 제외)

이렇게 되면 #4와 #5는 해결했지만 20이 루트 노드라서 #2 속성을 위반. 20을 black으로 바꿔주자
2. 루트 노드는 black

요약) case. 1(red 삽입 후 #4 속성을 위반했을 때)

삽입된 red 노드의 부모도 red & 삼촌(=부모의 형제)도 red라면 부모와 삼촌을 black으로 바꾸고 할아버지를 red로 바꾼 뒤 할아버지에서 다시 확인을 시작한다.

위 상태가 #4 속성을 위반한 상태이다.

이렇게 바꿔줘야 하는데...
우선 맨처음 상태에서 꺽여있는 상태를 펴줘야 하는데


요약) case. 2(red 삽입 후 #4 속성을 위반했을 때)
삽입된 red 노드가 부모의 오른쪽 자녀 & 부모도 red고 할아버지의 왼쪽 자녀 & 삼촌(=부모의 형제)은 black이라면 부모를 기준으로 왼쪽으로 회전한 뒤 case.3의 방식으로 해결.

해결 방법

1.20과 50의 색을 바꿔준다.


