⭐ 시뮬레이션 해 볼 수 있다!
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
트리 개념 점검하기!
d2 ≥ d1 * 2
를 성립한다. (동일한 Black Height 유지한다는 전제)첫째, 모든 노드는 red or black
둘째, 루트 노드는 black
셋째, 리프(NIL) 노드는 black
넷째, double red는 불가능 (red 노드의 자식은 black만 가능하다.)
다섯째,각 노드에서 리프 노드까지, black 노드의 수는 항상 같아야 한다.
(임의의 모든 노드에 대해 Black Height가 동일해야 한다. 자기 자신은 카운트에서 제외)
※
NIL
: 존재하지 않음을 의미하는 노드 (즉, 자녀가 없다는 의미)
→ R-B 트리에서 모든 리프노드는 NIL 노드이다!
💡 전제 : RB트리의 속성 5가지를 만족하고 있으며, 삽입하는 노드는 red (B-H 때문!)
step 1. BST의 방식으로 노드를 삽입한다.
step 2. 속성 5가지를 확인한다.
step 3. 위배되는 속성이 있으면, 이를 해결한다. (재조정)⇒ RB 트리를 만족한다. (반복)
👉 부모 노드를 black으로 바꿔준다.
삼촌 노드의 색이 red
인 경우
👉 Recoloring + 자식-부모-할아버지를 정렬하고 가운데 값을 기준으로 트리를 만들어 재배치한다.
삼촌 노드의 색이 black
인 경우
👉 Restructing + 자식-부모-할아버지를 정렬하고 가운데 값을 기준으로 트리를 만들어 재배치한다.
💡 전제 : RB트리의 속성 5가지를 만족하고 있다.
step 1. 대상 노드를 삭제한다.
step 2. 삭제 후, 속성 5가지를 확인한다.
step 3. 위배되는 속성이 있으면, 이를 해결한다. (재조정)⇒ RB 트리를 만족한다. (반복)
R-B 트리의 특정 노드를 삭제하는 과정은 조금 복잡한데..
우선, 문제가 되는 경우와 문제가 되지 않는 경우로 나눠볼 수 있다.
👍 문제가 되지 않는 경우
문제가 되지 않는 경우란, (노드) 대이동이 필요 없는 경우이다.
즉, BST 삭제와 동일하게 진행되지만(부모 자리에 적절한 자식이 들어옴 + 적절한 색으로 칠해짐) 그 주변부의 변경은 필요 없는 케이스이다.
삭제 노드의 자식이 2개인 경우는, 항상 문제 되지 않는다고 보면 된다.
반면, 삭제 노드의 자식이 없거나 1개만은 가지는 경우는 이야기가 달라지는데, 이 상황을 놓고 설명하겠다. (즉, 삭제 노드 m에 대해 자식이 1개 또는 없는 경우로만 제한하겠다.)
따라서, 문제가 되지 않는 경우는 다음과 같다.
red
인 경우black
이더라도 (유일한) 자식이 red
인 경우👎 문제가 되는 경우 : (노드) 대이동이 필요하다.
black
인 경우위의 경우, (동일해야 하는) Black Height에 오류가 생긴다!
결국,
삭제 노드의 서브트리
-부모 노드
-형제 노드 서브트리
간에
Black Height를 동일하게 맞추는 것이 삭제 연산의 관건이 되며,"존재할 수 있는 나머지 노드들에 대해 어떻게 처리할 것인지?"가 기준이 된다.
그리고 이에 따라 케이스를 분류할 수 있고, 각 케이스별로 해결방안을 찾아볼 수 있다.
고고씽
삭제된 지점(노드)의 부모 노드를 p
라 할 때, red / black 색상에 따라 두 가지 케이스로 분류한다.
그리고 이 두 분류에 따라 문제가 되는 케이스를 7가지로 나눠볼 수 있는데..
이렇게 나뉜다. 근데 이 중에서 중복된 걸 정리하면, 최종적으로 5가지 케이스로 분류할 수 있다. 그리고 이 5가지 케이스를 기준으로 R-B 트리의 삭제 연산 과정을 분류하겠다.
x + 왼쪽 서브트리 : m 노드가 삭제되고, 그 자리에 자식 x가 들어와 있다. B-H는 value-1
로, 1 감소되어 있다.
p : m 노드의 부모 노드이다.
s : m 노드의 형제 노드 서브 트리이다. B-H는 value
이다.
👉 p
와 s
의 색을 바꾼다.!
👉 반시계 방향으로 회전한다. → s
의 색은 상관 없지만, 이전 p
의 색에 맞춰 바꾼다.
👉 l
을 s
기준 시계방향으로 한 번 회전하고 → 서브트리 1과 2를 맞춰주고 → case *-2 단계로 처리한다.
👉 모든 노드가 black인 경우로, s
를 red로 바꾼다.
👉 s
가 유일하게 red인 경우로, 반시계 방향으로 회전시킨다. → 조카 노드의 색에 따라서 case 1-1, -2, -3 중에 하나로 처리한다.