에 부합하기 위한 기능으로 부모노드와 자식노드는 둘 다 레드의 색을 가질 수 없다의 기능을 충족하기 위한 기능을 말한다.
그래서 각 노드들은 아래와 같은 추상적 개념을 가지고있다.
struct RBTNode
{
struct RBTNode* parent;
struct RBTNode* left;
struct RBTNode* right;
int data;
enum Color color;
};
2) 삽입
N : 삽입할 노드
P : N의 부모 노드
U : N의 삼촌 노드, P의 형제노드
G : 조부모 노드
삽입은 총 5가지의 삽입 절차를 가지고 있다.
N 이라고 하는 새로운 노드가 트리의 시작(Root) 에 위치한다.
이 경우, 레드-블랙 트리의 첫 번째 속성(트리의 시작은 검은색이다)을 만족하기 위해서, N을 검은색으로 표시한다.
이 경우, 시작점으로부터 뻗어나가는 모든 경로에 검은색 노드를 하나 추가한 셈이 되기 때문에 레드-블랙 트리의 다섯 번째 속성(한 노드에서부터 뻗어나가는 모든 경로에 대해 검은색 노드의 수는 같다)은 여전히 유효하다.
새로운 노드의 부모 노드 P가 검은색이라면, 레드-블랙 트리의 네 번째 속성(붉은색 노드의 모든 자식 노드는 검은색이다)은 유효하다.
두 번째 경우에도 이 트리는 적절한 레드-블랙 트리이다.
레드-블랙 트리의 다섯 번째 속성(한 노드에서부터 뻗어나가는 모든 경로에 대해 검은색 노드의 수는 같다)도 별 문제가 없는데, 이는 새로운 노드 N은 두개의 검은색 노드를 leaf node로 가지고 있기 때문이다.
비록 N이 붉은색 노드라고 해도 N이 들어간 자리에 원래 위치했던 노드의 색이 검은색이었으므로, N의 자식 노드에게서 시작되는 경로들은 모두 같은 수의 검은색 노드를 가지게 되고, 결과적으로 다섯 번째 속성은 유지되게 된다.
만약 부모 노드 P와 삼촌 노드 U가 모두 붉은색 노드라면, 레드-블랙 트리의 다섯 번째 속성(한 노드에서부터 뻗어나가는 모든 경로에 대해 검은색 노드의 수는 같다)을 유지하기 위해서, P와 U를 모두 검은색으로 바꾸고 할아버지 노드 G를 붉은색으로 바꾼다.
붉은색 노드인 N은 검은색 부모 노드를 가지게 된다.
이번에는 할아버지 노드 G가 레드 블랙 트리의 두 번째 속성(root node는 검은색이다)이나 네 번째 속성(붉은색 노드의 두 자식 노드는 검은색이다)을 만족하지 않을 수 있다(네 번째 속성은 G의 부모 노드가 붉은색일 경우 만족하지 않는다).
이를 해결하기 위해서 G에 대해 지금까지 설명한 첫 번째 경우부터 세 번째 경우까지를 재귀적으로(recursively) 적용한다.이 작업은 삽입 과정 중에 발생하는 유일한 재귀 호출(recursive call)이며, 회전(rotation) 작업을 하기 전에 적용해야 한다는 것에 주의한다.
자식이 부모 왼쪽, 부모가 조부모 오른쪽일 경우 왼쪽 회전을 한다.
부모 노드였던 P를 다섯 번째 경우에서 처리하게 되는데, 이는 레드-블랙 트리의 네 번째 속성(붉은색 노드의 모든 자식은 검은색 노드이다)을 아직 만족하지 않기 때문이다.
회전 작업은 몇몇 경로들이 이전에는 지나지 않았던 노드를 지나게 하는데, 그럼에도 양쪽 노드가 모두 붉은색이므로, 레드-블랙 트리의 다섯 번째 속성(한 노드에서부터 뻗어나가는 모든 경로에 대해 검은색 노드의 수는 같다)을 위반하지 않는다.
자식이 부모 왼쪽, 부모가 조부모 왼쪽일 경우 오른쪽 회전을 한다.
회전의 결과 이전의 부모 노드였던 P는 새로운 노드 N과 할아버지 노드 G를 자식 노드로 갖는다,
G가 이전에 검은색이었고, P는 붉은색일 수밖에 없기 때문에, P와 G의 색을 반대로 바꾸면 레드-블랙 트리의 네 번째 속성(붉은색 노드의 두 자식 노드는 검은색 노드이다)을 만족한다.
바뀌기 전에는 G가, 바뀐 후에는 P가 P, G, N중 유일한 검은색 노드이다.
3) 삭제
N : 삽입할 노드
P : N의 부모 노드
U : N의 삼촌 노드, P의 형제노드
G : 조부모 노드
S : N의 형제 노드
삭제는 총 6가지의 삭제 절차를 가지고 있다
N 이 새로운 루트가 될때. 이 경우에는 더 할게 없다. 우리는 모든 경로에서 하나의 검은 노드를 삭제했고, 새로운 루트 노드는 검은색이므로 모든 특성이 보존된다.
S 가 빨강일 경우. P의 자식인 S가 빨강색이므로 P가 검은색임이 명확하다. 이 경우 P와 S의 색을 바꾸고, P에서 왼쪽으로 회전
S가 N의 할아버지 노드가 된다.
모든 경로에서의 검은 노드의 수가 같지 않으므로 아직 끝나지 않았다.
이제 N이 검은색 형제노드와 붉은색 부모 노드 갖고 있으므로, 4, 5, 6 절차를 진행할 수 있다.
P, S, 그리고 S의 자식들이 검은색인 경우. 이 경우, 우리는 간단히 S를 빨강으로 칠하면 된다.
S를 지나는 모든 경로들(N을 지나지 않는 경로)은 하나의 검은노드를 적게 갖고 있게 된다.
N의 원래 부모노드를 삭제하는 과정에서 N을 지나는 모든 경로들은 하나의 검은 노드를 적게 갖게 되므로, 양쪽은 같은 수의 검은 노드를 갖게 된다
P를 지나는 모든 경로들은 P를 지나지 않는 모든 경로에 대해 검은 노드를 한 개 적게 지니게 되므로, 특성 5(특정 노드에서부터 leaf로 가는 모든 경로에서 같은 수의 검은 노드를 지난다.)를 위반하게 된다.
이를 바로잡기 위해서, 우리는 P에다 case 1부터 시작하는 Rebalancing 과정을 수행해야 한다.
S와 S의 자식들은 검은색이지만, P는 빨강인 경우. 이 경우, 우리는 단순히 S와 P의 색을 바꾸면 된다.
이는 S를 지나는 경로의 검은 노드 개수에 영향을 주지 않지만, N을 지나는 경로에 대해서는 검은 노드의 개수를 1개 증가시킨다.
이는 원래 삭제된 검은 노드의 개수를 보충해준다.
S가 검정, S의 왼쪽 자식이 빨강, S의 오른쪽 자식이 검정이며, N이 부모의 왼쪽 자식인 경우. 이 경우 우리는 S를 오른쪽으로 회전시켜서 S의 왼쪽 자식이 S의 부모노드이자 N의 새로운 형제 노드가 되도록 만든다.
우리는 S의 색을 부모 노드의 색깔과 바꾼다. 모든 경로는 여전히 같은 수의 검은 노드수를 가지나, 이제 N이 오른쪽에 붉은 노드를 자식으로 둔 검은색 형제노드를 갖게 되었으므로, 6번째 절차로 진행하면 된다.
N이나 N의 부모노드는 이 변형에 아무런 영향을 받지 않는다.
S가 검정, S의 오른쪽 자식이 빨강이며, N 이 P의 왼쪽 자식인 경우. 이 경우 우리는 P를 왼쪽으로 회전해서, S가 P와 S의 오른쪽 자식노드의 부모 노드가 되게 한다.
우리는 P와 S의 색을 바꾸고, S의 오른쪽 자식노드를 검은색으로 만든다.
N은 이제 하나의 추가적인 검은 조상 노드를 가지게 된다:P가 검은색으로 바뀌든가, 아니면 P가 검은색이었고 S가 검은색 할아버지 노드로 추가되었든지. 그러므로, N을 지나는 경로는 하나의 추가적인 검은 노드를 갖게 된다.