레드-블랙트리는 AVL트리처럼 스스로 균형을 잡는 자가 균형 이진 탐색트리다.
- 모든 노드는 빨간색이나 검은색.
- 루트는 항상 검은색.
- 새로 추가되는 노드는 항상 빨간색, 즉 잎 노드는 항상 빨간색
- 루트에서 잎 노드로 가는 모든 경로에는 같은 수의 검은색 노드가 있어야 한다.
모든 잎노드가 루트까지 올라가는 동안 만나는 검은 노드의 개수가 모두 같다.- 어떤 경로에서도 빨간색 노드 2개가 연속으로 있어서는 안 된다.
빨간색 노드의 자식은 모두 검은색 노드여야하지만, 검은색 노드의 자식은 빨간색이 아니어도 된다.- 모든 빈 노드는 검은색이라고 가정.
이모 노드가 검은색일 경우
회전을 한다.
회전은 모든 트리가 동일하다.
회전을 하고 나면 부모 노드는 검은색, 두 자식 노드는 빨간색이 되어야한다.
이모 노드가 빨간색일 경우
색상 전환을 한다.
색상 전환을 하고 나면 부모 노드는 빨간색, 두 자식 노드는 검은색이 되어야 한다.
레드-블랙트리를 키와 값을 가진 클래스와 인터페이스를 가지고 구현해보자.
public class RedBlackTree<K,V> implements RedBlackI<K,V> {
Node<K,V> root;
int size;
class Node<K,V> {
K key;
V value;
Node<K,V> left, right, parent;
boolean isLeftChild, black;
public Node (K key, V value) {
this.key = key;
this.value = value;
left = right = parent = null;
black = false;
isLeftChild = false;
}
}
}
루트 노드와 크기 카운터를 전역변수로 설정해주었다.
내부클래스에서는 이모노드를 알아내기위해 left, right, parent포인터와 isLeftChild
라는 불리언 값을 정의했다.
isLeftChild
는 규칙을 망가트린 노드의 부모노드가 오른쪽 자식이라면 이모노드는 왼쪽자식일것이고, 부모노드가 왼쪽 자식이라면 이모노드는 오른쪽 자식에 있을 것이기 때문이다.
그리고 또 다른 불리언 값은 노드가 검정이면 참, 빨간색이면 거짓을 표시하기 위해 black
이라고 정의했다.
생성자는에서는 노드를 초기화 하기위해서 left,right,parent
를 모두 null
로 두고, 새로운 노드는 모두 빨간색 이기때문에 black
을 거짓으로 정의했다.
생성자의 노드는 아직 누구와도 붙어있지 않기때문에 isLeftChild
를 거짓으로 했으나 참으로 해도 상관은 없다.