[java] 레드-블랙 트리 알고리즘

레드-블랙 트리는 자가 균형 이진 검색 트리의 일종으로서, 삽입, 삭제, 검색 등의 연산을 빠르게 수행할 수 있는 알고리즘입니다. 이 알고리즘은 각 노드가 추가로 색상 정보를 가지고 있어, 트리의 균형을 조정할 수 있습니다.

레드-블랙 트리의 특징

  1. 루트 노드와 리프 노드(말단 노드)는 모두 검정색입니다.
  2. 두 개의 연속된 레드 노드는 존재할 수 없습니다.
  3. 어떤 노드에서부터 리프 노드까지의 경로에서 만나는 검정색 노드의 개수는 모든 경로에서 동일합니다.
  4. 어떤 노드의 왼쪽 서브 트리와 오른쪽 서브 트리는 모두 레드-블랙 트리여야 합니다.

레드-블랙 트리의 연산

삽입 (Insertion)

레드-블랙 트리에 노드를 삽입할 때는 다음과 같은 규칙을 따릅니다:

  1. 새로운 노드는 항상 레드로 삽입합니다.
  2. 두 개의 연속된 레드 노드가 생겨나서는 안 됩니다.
  3. 검정색의 부모 노드와 레드색의 자식노드, 혹은 레드색의 부모 노드와 레드색의 자식노드의 자식노드 사이의 색상 조합이 생기지 않아야 합니다.
  4. 삽입 후에도 트리의 모든 규칙을 만족해야 합니다.

삭제 (Deletion)

레드-블랙 트리에서 노드를 삭제할 때는 다음과 같은 규칙을 따릅니다:

  1. 삭제될 노드의 자식 노드를 찾아야 합니다.
  2. 삭제될 노드에 대한 대체 노드를 찾아야 합니다.
  3. 대체 노드가 삭제될 노드의 실제 위치와 다를 경우, 노드의 색상을 변경해야 합니다.
  4. 삭제 후에도 트리의 모든 규칙을 만족해야 합니다.

자바에서의 구현

레드-블랙 트리는 자바에서 쉽게 구현할 수 있습니다. 예를 들어, java.util.TreeMap 클래스는 레드-블랙 트리를 기반으로한 구조로 구현되어 있습니다. 이를 활용하면 레드-블랙 트리의 특성을 활용한 데이터 구조를 만들 수 있습니다.

아래는 TreeMap의 예시 코드입니다.

import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        // TreeMap 객체 생성
        TreeMap<Integer, String> treeMap = new TreeMap<>();

        // 데이터 추가
        treeMap.put(1, "One");
        treeMap.put(2, "Two");
        treeMap.put(3, "Three");

        // 데이터 출력
        System.out.println(treeMap);
    }
}

참고 자료