Balanced binary search tree
RB Tree는 이진트리의 구조를 그대로 채용하되, 딱 하나 색상(Color)라는 속성을 노드에 추가함으로서 자동으로 균형을 잡는 알고리즘
[Not balanced]
O(h) (h=트리의높이)
[Balanced]
O(logn)
레드블랙트리는 4개의 조건을 가지고있다.
Root Property
: 루트노드의 색깔은 검정(Black)이다.External Property
: 모든 external node들은 검정(Black)이다.Internal Property
: 빨강(Red)노드의 자식은 검정(Black)이다. == No Double Red
(빨간색 노드가 연속으로 나올 수 없다.) Depth Property
: 모든 리프노드에서 Black Depth는 같다. == 리프노드에서 루트노드까지 가는 경로에서 만나는 블랙노드의 개수는 같다. (그냥 노드의 수는 다를 수 있음.)이 경우, 3번 조건(Internal Property
)를 위반한다. (Red의 자식은 Black이어야하는데 Red==Double Red
)
1. Restructuring
2. Recoloring
Double Red를 해결하는 방법은 현재 insert된 노드의 uncle node(부모의 형제 노드)의 색깔에 따라 수행하는 프로시저가 다르다.
즉 위 그림으로 따지면, 현재 insert된 노드 z의 uncle node는?
w
가 된다w가 검정(Black) 일 땐 Restructuring
,
w가 빨강(Red) 일 땐 Recoloring
을 수행한다.
- 나(z)와 내 부모(v), 내 부모의 부모(Grand Parent)를 오름차순으로 정렬
- 무조건 가운데 있는 값을 부모로 만들고 나머지 둘을 자식으로 만든다.
- 올라간 가운데 있는 값을 검정(Black)으로 만들고 그 두자식들을 빨강(Red)로 만든다.
Black Depth
(조건 4번 : 모든 리프노드에서 Black Depth는 같다)Restructuring
자체의 시간복잡도는 O(1)
에 끝나지만, (순서결정시간 - 상수시간, 트리로 만드는시간 - 상수시간, 원래있던 노드들의 구조들을 바꿔주는 시간 - 상수시간)
Restructuring은 어떤 노드를 insertion한 뒤 일어나므로 총 수행시간은 O(logn)
이다. (지금 현재 노드가 들어갈 위치를 먼저 찾아야 하기 때문)
- 현재 inset된 노드(z)의 부모와 그 형제(w)를 검정(Black)으로 하고 Grand Parent(내 부모의 부모)를 빨강(Red)로 한다.
- Grand Parent(내 부모의 부모)가 Root node가 아니었을 시 Double Red가 다시 발생 할 수 있다.
2번 그림) 현재 insert된 노드 z의 부모 (v) = 7과, 그 형제 (w) = 2의 색깔을 검정으로 만들어준다.
3번 그림) z의 Grand Parent를 빨강(Red)로 만들어준다.
4번 그림) 하지만, 만약 Grand Parent(내 부모의 부모)가 Root Node였다면, RB Tree의 1번조건(Root Property)에 의해 검정(Black)이 된다.
5번 그림) 알고보니까 지금 우리가 보는 트리가 어떤 큰 트리의 서브트리였고, 4라는 Key를 가진노드가 Root가 아니었다면 => Double Red
가 생긴다.
Q : 저렇게 막 내 부모랑 uncle노드를 막 검정으로 바꿔도돼??!!
레드블랙트리의 4번조건: Depth Property 만족해?
A : 네. 만족합니다. Black Depth는 일제히 1증가하기 때문에 문제가 없습니다
insert를 하는데 "내 위치"를 찾아야한다. => O(logn)
Restructuring과 마찬가지로 Recoloring은 O(1)
의 시간이 걸립니다.
하지만, Recoloring은 Root까지 propagation될 수 있으므로 최악의 경우 O(logn)
이 걸리게 된다.
=> 총 O(logn)