삽입이든, 삭제든 반드시 BST의 삽입, 삭제를 우선적으로 처리하고 그 다음에 Red-black의 property가 깨지면 그것을 보정하는 방향으로 이해해야 한다. 즉, 만약에 BST의 삽입, 삭제 규칙을 지키면서 처리했는데, Red-black의 property가 깨지는 것이 없다면 그대로 끝내주면 된다.
Insert
1. 해당 트리에 아무것도 없는 경우에는 삽입하는 노드를 검은색으로 칠하고, 그렇지 않은 경우에는 빨간색으로 칠한다.
2.1. 삽입된 노드의 부모가 검은색인 경우 : 이 경우에는 Red-black property가 깨지는 것이 전혀 없으므로 바로 종료한다.
2.2 삽입된 노드의 부모가 빨간색인 경우 : 이 경우에는 Red-black property 중 red-property가 깨지게 되므로, 수정해야 한다.
3. Insert에서 어떤식으로 수정할지는 삽입된 노드 기준으로 부모의 sibling(uncle)을 기준으로 결정된다.
3.1 삽입된 노드 기준으로 부모의 sibling이 빨간색인 경우 : Recoloring을 처리해준다. 즉 조부모를 빨간색으로 칠하고, 그 자식들을 검은색으로 만든다.
단, 조부모를 빨간색으로 만든다는 지점때문에 새로운 문제점이 생길 수 있다. (Red property / Root property)
이 경우에는 다시 1번으로 돌아가 위 과정을 반복해주면 된다. 위 예시 같은 경우에는 Root가 빨간색이 되었기 대문에 10을 결과적으로 검은색으로 다시 바꾸는 작업을 추가적으로 진행해주어야 한다.
3.2. 삽입된 노드 기준으로 부모의 sibling이 검은색인 경우 : Rotation and recoloring (삽입된 노드부터 시작해서 조부모까지 연결한 것을 rotation하고 recoloring한다. recolor하는 것 자체는 직관적이라 쉽게 판단할 수 있다.
1줄 요약 : Insert의 경우 반드시 부모의 형제를 보도록 하자.
연습 문제 : 10, 18, 7, 15, 16, 30, 25, 40, 60, 2, 1, 70을 삽입하는 상황
Delete
다시 말하지만, BST의 삭제를 먼저 수행하고, 지워야할 노드를 선택하는 것이다. 반드시 결과적으로 정말로 지워야하는 노드를 봐야한다.
1. 지워야할 노드가 빨간색인 경우 : 그냥 지운다.
2. 지워야할 노드가 검은색인 경우 : Double black이 발생하게 된다. 그래야 depth property가 깨지지 않는다.
2.1 Double black이 나타나는 노드가 Root인 경우 : 그냥 종료 (결과적으로 전체적인 black depth가 1개 작아진 상황)
2.2 Double black이 나타나는 노드가 Root가 아닌 경우 : 반드시 Double black이 나타나는 노드의 형제가 어떤 색을 가지고 있는지 확인한다.
2.2.1 Double black이 나타내는 노드의 형제가 검은색
2.2.1.1 형제들의 자식들이 모두 검은색인 경우 : 부모에게 1개의 black을 넘기고, Double black이 나타내는 노드의 형제를 빨간색으로 색칠한다.
주의해야할 지점은 만약, 부모가 이미 검은색인 경우는 Double black이 이동하게 된다. (빨간색인 경우는 그냥 검은색이 되는 것으로 끝난다.) 이와 같은 경우가 발생한다면, 결과적으로 Double black이 위로 전파됨에 따라 2.1이나 2.2를 반복하게 되는데, 계속해서 위로 전파될 수는 없고 최대한 많이 위로 올라가봐야 2.1을 마지막으로 끝나는 수 밖에 없다. 따라서 위와 같은 과정은 유한번만 반복되게 된다. (최대 트리의 높이 : logV).
위에 해당하는 예시를 살펴보도록 하자.
2.2.1.2 형제의 자식들 중 Double black과 가까운 노드가 빨간색, 먼 노드가 검은색인 경우
Double black의 형제와, 빨간색 자식의 색을 바꾼다.
Rotation (Double black 반대 방향으로)
2.2.1.3의 과정을 반드시 수행하게 된다.
2.2.1.3 형제의 자식들 중 Double black과 가까운 노드가 검은색, 먼 노드가 빨간색인 경우
Double black의 부모와, 형제의 색을 바꾼다.
Rotation (Double black 방향으로)
Double black 중 1개의 black를 기존의 형제들의 자식들 중 빨간색인 녀석에게 넘겨준다.
2.2.2 Double black이 나타나는 노드의 형제가 빨간색인 경우
Double black의 부모와 Double black의 형제들의 색을 바꾼다.
Double black 방향으로 rotation한다. (이 부분은 직관적으로 이해할 수 있다.)
2번부터 다시 확인한다. (결과적으로 leaf쪽으로 내려가기에 언젠가는 종결된다.)
1줄 요약 : Delete의 경우 문제가 생기는 상황은 Double black이고, Double black의 형제를 보도록 하자.
연습 문제 : 위 그림에서 55, 30, 90, 80, 50, 35, 15를 삭제하는 상황