alt
Home Red Black Tree
Post
Cancel

Red Black Tree

: 이진 탐색 트리(BST)는 조회, 삽입, 삭제시 O(logN)== O(h) == O(depth) 의 시간이 걸린다. 그런데, 운이 좋지 않아 편향된 모양을 갖게 되면 될수록 시간복잡도는 O(N)에 가까워진다. 따라서 균형잡힌 이진탐색트리를 유지하는게 좋은데, 그 중 하나로 대표적인게 RBT이다.


특징

  • 자가 균형잡힌 이진트리
  • 실 사용에서 효율적
    • 실제로 실무에 많이 사용된다고 함.
  • 항상 O(logN)
  • Leaf 노드는 NIL값을 저장.
  • 최소경로와 최대경로 비율이 최대 2로 유지
  • Java에서 ArrayList의 경우 내부적으로 RBT로 구현되어있다고 함.


규칙

  1. 각 노드는 Red 혹은 Black
  2. Root와 Leaf 노드(NIL) 는 Black.
    • 모든 Leaf 는 NIL을 자식으로 갖는다.
  3. Red노드의 두 자식노드는 Black이다.
  4. Root에서 임의의 Leaf(NIL)까지 가는 경로에서 만나는 Black 노드의 수는 같다.
    • 그냥 노드의 수는 다를 수 있음.
    • 이 것을 Black Height 라고 한다.
    • Black height: 노드 x 로부터 노드 x 를 포함하지 않은 Leaf 까지의 simple path 상에 있는 Black 노드들의 개수


삽입

  • 삽입된 노드를 Red로 지정.
    • Black height 변경을 최소화하기 위해
  • 삽입 결과 규칙을 위배해버리면(double red) uncle노드의 색깔에 따라 어떻게 변경할지 정책을 정함
    • uncle black - Restructuring
    • uncle red - Recoloring


Restructuring (이걸 rotation이라고 함)

  • 나와 부모와 부모의 부모 노드를 정렬해, 가운데 노드를 Root로 만들어버림
  • 다른 서브트리에 영향을 미치지 않음. 따라서, 한번의 restructuring이면 끝남. 따라서 O(1).
    • 그러나, 삽입 자체의 시간복잡도가 있기 때문에 전체 시간복잡도는 O(logN)


Recoloring

  • 부모와 uncle을 Black으로, 부모의 부모를 Red로 바꿔버림.
  • 한번에 끝나지 않을 수도 있음.
    • 이유: 위의 경우에서 부모의 부모가 전체의 root가 아니었뎐 경우에 변경 후 또 double red가 나올 가능성이 있다.
    • 최악의 경우 root까지 Propagation되고, 이 때 O(log N)이 걸리게 될 듯



Reference)

https://zeddios.tistory.com/237

https://velog.io/@agugu95/%EC%9D%B4%EC%A7%84-%ED%8A%B8%EB%A6%AC%EC%9D%98-%EA%B7%A%ED%98%95-RED-BALCKAVL

https://itstory.tk/entry/%EB%A0%88%EB%93%9C%EB%B8%94%EB%9E%99-%ED%8A%B8%EB%A6%ACRed-black-tree

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/DataStructure

This post is licensed under CC BY 4.0 by the author.