본문 바로가기
카테고리 없음

레드-블랙 트리(Red-Black Tree) 개념 (규칙, 사용처)

by kguidebook0001 2026. 2. 4.

이진 탐색 트리(BST)의 편향 문제를 해결하기 위해 고안된 자료구조 중, 실무에서 가장 널리 쓰이는 것이 바로 레드-블랙 트리(Red-Black Tree)입니다. 앞서 다룬 AVL 트리가 '엄격한 균형'을 유지하여 검색 속도를 극대화했다면, 레드-블랙 트리는 '적당한 균형'을 유지하여 데이터의 삽입과 삭제 속도까지 최적화한 모델입니다. 이러한 특성 덕분에 C++의 STL(map, set), Java의 HashMap, 그리고 리눅스 커널의 스케줄러 등 고성능이 요구되는 시스템의 핵심 엔진으로 자리 잡았습니다. 이 글에서는 레드-블랙 트리가 어떻게 색상(Color)만으로 트리의 균형을 유지하는지, 그 5가지 절대 규칙과 활용 분야를 심층 분석합니다.

1. 레드-블랙 트리(Red-Black Tree)의 핵심 개념

레드-블랙 트리는 자가 균형 이진 탐색 트리(Self-Balancing BST)의 일종으로, 각 노드에 빨간색(Red) 또는 검은색(Black)이라는 추가적인 비트 정보를 저장하여 트리의 높이를 제어합니다.

1-1. 균형의 정의: 2배의 법칙

레드-블랙 트리는 AVL 트리처럼 완벽한 균형을 추구하지 않습니다. 대신, "가장 긴 경로가 가장 짧은 경로의 2배를 넘지 않도록" 보장합니다. 이 느슨한 균형 조건 덕분에 데이터 삽입이나 삭제 시 발생하는 트리의 재구조화(Rotation) 연산 횟수가 AVL 트리보다 현저히 적어, 쓰기 작업(Write Operation)이 빈번한 환경에서 탁월한 성능을 발휘합니다.

2. 절대 깨질 수 없는 5가지 규칙 (Properties)

레드-블랙 트리가 $O(\log N)$의 시간 복잡도를 보장하는 비결은 바로 아래의 5가지 규칙에 있습니다. 데이터가 추가되거나 삭제될 때 이 규칙이 위반되면, 트리는 색상 변환(Recoloring)이나 회전(Rotation)을 통해 다시 규칙을 만족시킵니다.

  • 제1규칙: 모든 노드는 Red 혹은 Black 중 하나의 색상을 가집니다.
  • 제2규칙: 루트 노드(Root Node)는 항상 Black입니다.
  • 제3규칙: 모든 리프 노드(NIL)는 Black입니다. (여기서 리프 노드는 데이터를 담지 않은 가상의 NULL 노드를 의미합니다.)
  • 제4규칙 (Red Property): Red 노드의 자식은 무조건 Black이어야 합니다. (즉, Red 노드가 연속으로 두 번 나타날 수 없습니다. 'Double Red' 불가)
  • 제5규칙 (Black Height Property): 특정 노드에서 자손 리프 노드(NIL)로 가는 모든 경로에는 동일한 개수의 Black 노드가 존재해야 합니다.

2-1. 규칙의 기술적 의미

특히 제4규칙제5규칙이 핵심입니다. 제4규칙은 경로의 길이가 무한정 길어지는 것을 막고, 제5규칙은 모든 경로가 일정 수준의 균형을 유지하도록 강제합니다. 이 두 규칙의 조합으로 인해, 최악의 경우에도 트리의 높이는 $\log N$을 넘지 않게 됩니다.

3. AVL 트리와의 비교 및 적합한 사용처

두 자료구조 모두 $O(\log N)$을 보장하지만, 내부 동작 방식의 차이로 인해 사용되는 분야가 명확히 갈립니다.

3-1. 성능 비교 (Trade-off)

  • 검색(Lookup) 속도: AVL 트리가 더 엄격하게 균형을 맞추므로 트리의 높이가 더 낮아 검색이 약간 더 빠릅니다.
  • 삽입/삭제(Insert/Delete) 속도: 레드-블랙 트리는 회전(Rotation) 횟수가 적으므로, 데이터 변경이 빈번할수록 더 빠릅니다.
  • 메모리 사용: 레드-블랙 트리는 노드당 1비트의 색상 정보만 필요하므로, 정수형 높이 정보를 저장해야 하는 AVL 트리보다 메모리 효율이 좋습니다.

3-2. 실제 사용 사례 (Real-world Use Cases)

레드-블랙 트리는 범용성과 안정성이 뛰어나 현대 컴퓨팅 시스템 곳곳에서 사용됩니다.

  • Java Collections: TreeMapTreeSet의 내부 구현체이며, Java 8부터는 HashMap의 버킷 데이터가 많아질 경우(Threshold 초과 시) 연결 리스트 대신 레드-블랙 트리를 사용하여 검색 속도를 $O(N)$에서 $O(\log N)$으로 최적화했습니다.
  • C++ STL: std::map, std::set, std::multimap 등의 연관 컨테이너가 레드-블랙 트리로 구현되어 있습니다.
  • Linux Kernel: 가상 메모리 관리(VMA)와 CPU 스케줄러인 CFS(Completely Fair Scheduler)에서 프로세스의 실행 시간을 관리하기 위해 사용합니다.
[핵심 요약 : 레드-블랙 트리]
1. 균형 전략: 색상(Red/Black) 규칙을 통해 느슨한 균형을 유지하며, 최악의 경우에도 $O(\log N)$ 성능을 보장합니다.
2. 핵심 규칙: "Red 노드는 연속될 수 없다(No Double Red)"와 "모든 경로의 Black 노드 수는 같다"는 규칙이 트리의 높이를 제어합니다.
3. 선택 기준: 데이터의 삽입과 삭제가 빈번한 시스템(운영체제 스케줄러, DB 인덱스 등)에서는 AVL 트리보다 레드-블랙 트리가 더 효율적입니다.