[알고리즘] Red-Black Tree

Seaniiio·2024년 4월 30일

알고리즘

목록 보기
6/10

Binary Search Tree

다음의 조건을 만족시키는 Binary Tree를 Binary Search Tree로 정의한다.

  • 각 노드에는 key값이 저장되어 있다.
  • 모든 노드에 대해, key값은 left subtree의 모든 key값보다 크다.
  • 모든 노드에 대해, key값은 right subtree의 모든 key값보다 작다.

+) Binary Search Tree에서 in-order traversal을 하면, 오름차순으로 정렬된 key list를 얻을 수 있다.

+) Binary Search Tree의 높이를 h라고 할 때, 탐색 연산은 O(h)만큼의 시간을 소요하기 때문에, 높이를 최소한으로 줄이는 것이 중요하다.(as balanced as possible)

+) Binary Search Tree에서 삽입, 삭제 연산에도 탐색 연산이 수행된다. 따라서 탐색 연산의 복잡도를 최소한으로 하는 것이 중요하다.

Balanced Binary Search Tree

  • 트리의 모든 높이에서 좌우 서브트리의 높이 차이가 일정 범위 내로 유지되도록 설계된 데이터 구조를 Balanced Binary Search Tree라고 정의한다.
  • 노드의 수가 N일때, 높이는 약 logN이 되므로, 탐색 연산의 시간복잡도는 O(logN)이다.
  • 대표적인 예시로는 AVL Tree, Red-Black Tree가 있다.

Red-Black Tree

다음의 조건을 만족시키는 Binary Search Tree를 Red-Black Tree로 정의한다.

  • Root Property: 루트 노드는 black이다.
  • External Property: 모든 leaf노드는 black이다.
  • Internal Property: red의 자식노드는 black이다.
  • Black Depth Property: 모든 leaf노드에 대해, black depth는 동일하다.
    (Black Depth: root로 가는 경로중에 마주치는 black노드의 수)

Red-Black Tree는 Balanced Binary Search Tree로, 높이는 logN이다.

Red-Black Tree Insertion

Red-Black Tree의 삽입 연산의 순서는 다음과 같다. (삽입하고자 하는 노드를 z key값을 k라고 하자.)

  1. find(k)를 통해 z가 위치해야할 곳을 찾는다.
  2. z를 찾은 위치에 삽입한다. (v는 red)
  3. z의 부모 노드가 red인 경우, Internal Property를 어기기 때문에, Restructuring 혹은 Recoloring을 진행한다.

Restructuring

z의 uncle node가 black인 경우, restructuring을 진행한다.

  • z의 parent, grandparent node를 binary search tree형태로 만들어준다.
  • root를 black으로, 두 자식을 red로 설정한다.
  • 해당 과정은 O(1) time이 소요된다.

Recoloring

업로드중..

z의 uncle node가 red인 경우, restructuring을 진행한다.

  • z의 parent, uncle을 black으로 수정하고, grandparent를 red로 수정한다.
  • 해당 과정은 O(1) time이 소요된다.
  • 이렇게 recoloring한 결과 다시 double red가 발생하면, 해당 노드에 대해 다시 restructuring이나 recoloring을 진행한다.
  • 만약 grandparent가 root인 경우, Root Property에 의해 root를 다시 black으로 설정해준다.

Recoloring이 계속 반복되어 root까지 올라가면 O(1)을 약 logN번 반복하게 된다. 따라서 삽입 연산에서 double red를 해소하는 과정은 최악의 경우 O(logN) time이 소요된다.

0개의 댓글