O(n)
log n
으로 일정하게 유지하여 SEARCH, INSERT, DELETE와 같은 작업이 O(log n)
이 되게끔 한다. (n은 노드의 개수)Root Property
: root node는 BlackExternal Property
: 모든 external node는 BlackInternal Property
: Red 노드의 자식은 모두 BlackDepth Property
: 모든 leaf node에서 root 노드까지 Black 노드의 개수는 같다.ex)
Red
노드이다.Red
인 경우 -> RecoloringBlack
으로 바꾸고 grand parent를 Red
로 바꾼다.Black
인 경우 -> RestructuringBlack
으로 설정하고 나머지 두 자식을 Red
로 설정한다.Red
였을 경우, Recoloring 이후 또 double red
가 발생하게 되기 때문에 다시 케이스에 따라 Recoloring 또는 Restructuring을 해준다.Black
으로 만들고 서브트리는 규칙에 맞게 Restructuring 되는 것이기 때문에 double red
가 발생하지 않는다.트리에서 노드를 삭제할 때 없어지는 색을 y_origin_color 라고 한다. 이 origin_color에 따라 fix up 여부가 달라짐. (origin_color가 Black
일 때만 fix up이 필요하다. -> 이 때만 Black height
이 달라지므로.)
삭제하려는 노드를 z라고 할 때
1-1. z의 자식이 두 명이 아니라면 없어지는 y_color는 z color
.
존재하는 z의 자식(둘 다 존재하지 않는다면 leaf node)를 z 자리에 이식. z는 해제
1-2. z의 자식이 두 명이라면 없어지는 y_color는 minimum(z->right) color
.
minimum(z->right)
을 z자리에 이식하기 때문에 결국 사라지는 색은 minimum의 색. (z 자리에 이식할 때 노드색을 z 것으로 물려받는다.)
fix up에 사용할 노드를 x라고 할 때
2-1. z의 왼쪽 자식이 없다면 x는 z->right
. z의 오른쪽 자식이 없다면 x는 z->left
.
2-2. z의 자식이 두 명이라면 x는 minimum(z->right)->right
.
minimum은 subtree의 가장 왼쪽 노드이므로 왼쪽 자식이 없음. right가 당연함.
Case 4. s는 Black
. s->right가 Red
.
1. s의 color = s->parent color.
2. s->parent, s->right color = Black.
3. s를 기준으로 rotate.
Case 3. s는 Black
. s->left는 Red
. s->right는 Black
.
s->right를 Red
가 되게 만든 다음 Case4를 적용한다.
1. s와 s->left의 color를 바꾼다. (s는 Red로, s->left는 Black으로 바뀜)
2. s->parent를 기준으로 right rotate. (s->parent, 즉 Red가 right child가 된다.)
Case 2. s는 Black
. s->left도 Black
. s->right도 Black
.
s를 Red
로 바꾸고 x->parent에 fix up을 위임. (x = x->parent로 한 다음 다시 x->parent 입장에서 fix up 진행.)
1. s->color = Red
2. x = x->parent
이후 Case 1, Case 2, Case 3, Case 4를 업데이트된 x 입장에서 다시 검사하여 fix up 진행
Case 1. s가 Red
. s를 Black
으로 바꾼 다음 Case 2, Case 3, Case 4를 검사.
1. s->color = Black
Case 2, Case 3, Case 4 (s가 Black인 케이스들) 차례로 검사하면서 fix up 진행