Red-Black Tree(레드블랙 트리)는 이진 탐색 트리(BST)의 일종으로, 삽입과 삭제 연산 시 트리의 균형을 유지하기 위해 노드에 색상 속성을 부여한 구조이다.
AVL 트리보다 리밸런싱이 느슨하지만, 삽입/삭제 성능이 더 우수해 실전에서 더 자주 사용된다.
대표적인 예로 Java의 TreeMap
, C++ STL의 map
, 리눅스 커널의 스케줄링 큐 등에서 사용된다.
Red-Black Tree는 다음 다섯 가지 규칙을 항상 만족해야 한다.
이러한 규칙들을 통해 트리의 높이를 제한하여 O(log n) 탐색 성능을 보장한다.
Red-Black Tree에서 새로운 노드는 항상 빨강(Red)으로 삽입된다.
이후 부모와 삼촌 노드의 색상을 확인하고, 3가지 케이스에 따라 처리한다.
Red-Black Tree에서 삭제는 BST처럼 노드를 제거한 뒤, 트리의 균형과 색상 규칙을 복구하는 과정이 추가된다.
특히 검정 노드를 삭제하면 "이중검정(Double Black)" 상태가 발생할 수 있으며, 이를 처리하기 위해 색상 변경과 회전이 사용된다.
복구는 형제(sibling) 노드의 색상과 자식 노드의 상태에 따라 다음 네 가지 케이스 중 하나로 분기된다.
형제가 RED
→ 부모와 색 교환 후 회전 → BLACK 형제 케이스로 전환
형제가 BLACK + 자식들이 모두 BLACK
→ 형제를 RED로 만들고 이중검정을 부모로 전파
형제가 BLACK + 가까운 자식만 RED
→ 형제와 자식 색 교환 + 형제 기준 회전 → Case 4로 전환
형제가 BLACK + 먼 자식이 RED
→ 부모와 색 교환 후 부모 기준 회전 → 이중검정 제거
Red-Black Tree 삭제는 구현이 복잡하지만, 이러한 규칙을 따라가면 항상 균형이 유지되며 O(log n) 성능을 보장한다.
Red-Black Tree는 구현이 복잡하므로, 보통 직접 구현하지 않고 라이브러리를 활용한다.
rbtree
(외부 모듈)bintrees
모듈의 RBTree
map
, set
TreeMap
, TreeSet