[그림 1] 레드-블랙 트리 예제 |
[그림 2] Right-Rotation, Left-Rotation |
[그림 3] 레드-블랙 트리의 조건을 만족하는 Worst Case 예제 |
struct node
{
int key; //key for sort
DATA data; //node data
struct node *parent; //point to parent
struct node *left; //point to left child
struct node *right; //point to right child
int color; //node color(red or black)
};
부모 노드(P) : 빨간색, 삼촌 노드(U) : 빨간색 인 경우
① : 노드 삽입 시, 부모 노드(P)와 삼촌 노드(U)가 모두 빨간색인 경우.
② : 부모 노드(P)와 삼촌 노드(U)를 검정색으로 칠하고, 조부모 노드(G)를 빨간색으로 변경한다.
③ : 조부모 노드(G)가 빨간색이 되었으므로 조건 4)에 위배될 가능성이 있다. 따라서 이를 새로 삽입한 노드로 간주하고 재귀적으로 다시 검사를 시작한다.
|
부모 노드(P) : 빨간색, 삼촌 노드(U) : 검은색, Left-Left 인 경우
① : 노드 삽입 시, 부모 노드(P)는 빨간색, 삼촌 노드(U)는 검정색인 경우, 또한 Left-Left인 경우.
② : 조부모 노드(G)를 기준으로 Right-Rotation을 수행한다.
③ : 기존의 부모 노드(P)를 검정색으로, 조부모 노드(G)를 빨간색으로 변경한다
|
부모 노드(P) : 빨간색, 삼촌 노드(U) : 검은색, Left-Right 인 경우
① : 노드 삽입 시, 부모 노드(P)는 빨간색, 삼촌 노드(U)는 검정색인 경우, 또한 Left-Right인 경우.
② : 부모 노드(P)를 기준으로 Left-Rotation을 수행한다.
③ : 조부모 노드(G)를 기준으로 Right-Rotation을 수행한다.
④ : 삽입 노드(N)을 검정색으로, 조부모 노드(G)를 빨간색으로 변경한다.
|
부모 노드(P) : 빨간색, 삼촌 노드(U) : 검은색, Right-Right 인 경우
① : 노드 삽입 시, 부모 노드(P)는 빨간색, 삼촌 노드(U)는 검정색인 경우, 또한 Right-Right인 경우.
② : 조부모 노드(G)를 기준으로 Left-Rotation을 수행한다.
③ : 기존의 부모 노드(P)를 검정색으로, 조부모 노드(G)를 빨간색으로 변경한다.
|
부모 노드(P) : 빨간색, 삼촌 노드(U) : 검은색, Right-Left 인 경우
① : 노드 삽입 시, 부모 노드(P)는 빨간색, 삼촌 노드(U)는 검정색인 경우, 또한 Right-Left인 경우.
② : 부모 노드(P)를 기준으로 Right-Rotation을 수행한다.
③ : 조부모 노드(G)을 기준으로 Left-Rotation을 수행한다.
④ : 삽입 노드(N)을 검정색으로, 조부모 노드(G)를 빨간색으로 변경한다.
|
키 값이 "50"인 노드를 삭제하려는 경우
① : 삭제하려는 노드가 "50"일 때, 자식 노드가 있는 경우 교체할 노드를 탐색한다.
② : 교체 가능한 노드는 "45", "65"이며, 그 중 "45"를 선택하여 위치를 교체한다.(Color는 교체되는 위치의 색을 따른다)
③ : 위치 변경 후, 다시 확인하여 자식 노드가 있는 경우 다시 교체할 노드를 탐색한다.
④ : 교체 가능한 노드는 "42"이며, 위치를 교체한다. (Color는 교체되는 위치의 색을 따른다)
⑤ : 위치 변경 후, 다시 확인하여 자식 노드가 없는 경우 Exchange Stage를 마친다.
※Exchange 단계 이후, 삭제 노드는 더 이상 자식이 없다.
|
형제 노드(S) : 빨간색 인 경우
① : 형제 노드(S)를 검은색, 부모 노드(P)를 빨간색으로 칠한다.
② : 부모 노드(P)를 기준으로 삭제 노드 방향으로 회전한다.
③ : 아직 균형이 맞지 않으므로 다시 삭제 노드를 기준 노드로 삼고 Rebalancing 연산을 재귀호출한다.
④ : Rebalancing Stage를 끝마친다.
|
형제 노드(S) : 검은색 인 경우
자식노드(Ci, Co) 중 하나라도 빨간색 이 존재하는 경우
① : 만일 형제 노드(S)의 자식 노드 중 내측 자식(Ci) 만이 빨간색인 경우 형제 노드의 트리 구조를 변형한다.
변형하는 이유는 외측 자식(Co)가 빨간색일 경우로 통일하여 처리하는 것이 수월하기 때문이다.
=> 이제 형제 노드(S)의 외측 자식(Co)은 빨간색이며, 내측 자식(Ci)은 빨간색, 검은색 모두 가능하다.
② : 형제 노드(S)는 부모 노드(P) 색으로 변경하고, 부모 노드(P)와 형제 노드(S)의 외측 자식 노드(Co)를 검은색으로 변경한다.
③ : 부모 노드(P)를 기준으로 삭제 노드 방향으로 회전한다.
④ : Rebalancing Stage를 끝마친다.
|
형제 노드(S) : 검은색 인 경우
부모 노드(P) : 빨간색, 모든 자식노드(Ci, Co) : 검은색 인 경우
① : 형제 노드(S)를 빨간색으로, 부모 노드(P)를 검정색으로 변경
② : Rebalancing Stage를 끝마친다.
|
형제 노드(S) : 검은색 인 경우
부모 노드(P) : 검은색, 모든 자식노드(Ci, Co) : 검은색 인 경우
① : 형제 노드(S)를 빨간색으로 변경한다. |