번외) 레드 블랙 트리 정리
레드-블랙 트리
이진 트리의 약점을 극복하기 위해 새로운 규칙을 추가하여 나온 이진 트리이다. 자바의 TreeSet과 TreeMap은 레드-블랙 트리를 베이스로 한 구현을 사용한다.
레드-블랙 트리의 조건
모든 트리의 노드에 검은색 혹은 빨간색을 색칠한다.
루트 노드는 항상 검은색이다.
모든 리프 노드 들은 검은색이다.
빨간색 노드의 자식은 양쪽 다 항상 검은색이다.
4.1. 즉, 빨간색 노드는 연달아 나타날 수 없다.
4.2. 이 규칙을 지키면, 검은색 노드만이 빨간색 노드의 부모가 될 수 있다.
루트 노드에서 어떠한 자식 노드를 타고 가던지 리프 노드에 도달했을 때 항상 같은 수의 검은색 노드를 만나게 된다.
리프 노드 (leaf node) 란? 자식 노드가 더 이상 존재하지 않는 노드를 말한다. 리프의 뜻은 잎사귀이다. 더 뻗어나가는 가지가 아니라 잎사귀로 끝맺는 노드를 말한다.
리프 노드의 반대는 내부 노드(internal node) 라고 부른다.
레드-블랙 트리 삽입
레드 블랙 트리에서 모든 새로운 노드는 빨간색 색상을 가진채로 삽입되어야 한다.
추후 레드-블랙 트리의 조건에 맞게 다시 변경한다.
이 과정에서 재색칠, 회전 등이 일어난다.
삽입 연산에 드는 시간은 그냥 일반적인 이진 트리와 비슷하다.
삽입 연산 이후 레드-블랙 트리의 모든 조건을 체크해봐야 한다.
만일 모든 조건이 충족된다면, 다음 연산으로 넘어가고, 아니라면 아래와 같은 연산을 실행하여 레드-블랙 트리로 만들어주어야 한다.
재색칠
회전
재색칠 이후 회전
레드-블랙 트리 삽입 절차
트리가 비었는지 확인한다.
트리가 비었다면, 검은색 루트 노드를 삽입한다.
트리가 비어있지 않다면, 빨간색 리프 노드를 삽입한다.
새 노드의 부모가 검은색이라면, 연산을 마친다.
새 노드의 부모가 빨간색이면, 새 노드의 부모의 형제를 확인한다.
새 노드 부모의 형제가 검은색 혹은 NULL이면, 적절한 회전과 재색칠을 한다.
새 노드 부모의 형제가 빨간색이면, 재색칠을 한다.
간단한 의사코드 작성
자바 코드 구현
예제 (Step by step)
8, 18, 5, 15, 17, 25, 40을 삽입해보겠다.
8 삽입

레드-블랙 트리 삽입 절차에서 1. 항목에 의해 트리가 비어있음을 확인하였고, 1.1. 항목에 의해 검은색 루트 노드를 삽입했다.
18 삽입

이진트리 기본 규칙에 의해 부모 노드보다 크므로 오른쪽에 삽입된다. 레드-블랙 트리 삽입 절차의 1.2의 규칙에 따라 빨간색 리프 노드가 삽입되었고 1.2.1의 규칙에 따라 부모가 검은색이므로 연산을 마친다.
5 삽입

이진트리의 기본 규칙에 의해 부모 노드보다 작으므로 왼쪽에 삽입된다. 나머지는 18을 삽입할 때와 동일한 규칙이 적용되었다.
15 삽입

이진트리의 기본 규칙에 의해 루트 노드보다 크므로 오른쪽 아래로 그리고 18 노드보다는 작으므로 왼쪽 아래에 위치했다.
그런데, 위의 모습은 새 노드 부모(18)의 형제가 빨간색이므로, 삽입 절차 중 1.2.2.2에 해당한다. 그러므로 재색칠을 한다.






17 삽입



좌측 회전을 위해 먼저 해당 노드를 부모 노드로 설정함


좌측 회전 시작
해당 노드가 왼쪽 자식일 때, 해당 노드의 왼쪽 자식이 부모의 왼쪽 자식이 된다. 이게 일어나는 이유는, 이진트리의 규칙을 따라서 삽입되었다고 가정했을 때, 1. 노드가 왼쪽 자식이라면 부모 노드보다 작다는 것이 보장된다. (부모 노드 > 노드) 2. 노드가 가진 오른쪽 자식은 노드보다는 크지만, 노드의 부모 노드보다는 작은 것이 보장된다. (부모 노드 > 노드의 오른쪽 자식 > 노드) 3. 결국 노드의 오른쪽 자식이 부모 노드의 왼쪽 자식으로 편입되어도 아무런 문제가 없다.
이러한 회전을 하는 이유는 결국 균형이 맞지 않게 주렁주렁 아래 노드로만 편입되는 현상을 막기 위함을 알아야 한다. 간단히 추상화하면,
부모,해당 노드,해당 노드의 자식 노드총 3개의 노드가 있을 때 가운데 값을 위로 올려서 가운데 값을 기준으로 나머지 노드를 왼쪽 자식 노드로 오른쪽 자식 노드로 배치하여 트리의 height 를 줄이려는 것이다. (어떤 블로그에서는 이러한 행위를 회전(rotate) 이라고 표현하지 않고, 재구성(restructure) 이라고 표현하기도 한다.) 하지만 이번 좌측 회전이 끝나도 height 가 줄어들진 않고, 이후에 우측 회전에 끝난 후에는 height 가 1 감소할 것이다. 좌측 회전이 끝난 후에는 마지막 노드가 부모의 왼쪽 자식이 된다.The height of a node is the length of the longest downward path to a leaf from that node. (height 란, 해당 노드로부터 리프 노드까지 내려가는 가장 긴 경로의 길이이다.)




여기까지가 좌측 회전의 끝이다. 결과적으로 18과 가장 차이가 적게 나는 17이 왼쪽 자식 노드로 올라왔고, 15는 17의 자식 노드가 되었다.




우측 회전 시작
우측 회전도 결국엔 좌측 회전과 매커니즘은 동일하다. 부모 노드, 노드, 자식 노드가 있을 때, 대소 관계를 비교한다. 여기서는 회전을 주체하는 해당 노드가 우측 노드이므로, 노드 > 자식 노드 > 부모 노드의 관계가 성립한다. 그러므로 중간 값인 자식 노드를 위로 올려 밸런스를 맞추는 로직이 진행된다.




25 삽입

노드의 부모의 형제가 빨간색이라면 현재 노드의 부모와 부모의 형제의 height 차이는 없게 된다. 왜냐하면 레드 블랙 트리 특성상 루트 노드에서 리프 노드까지 가는 도중 만나는 검은색 노드의 숫자는 같아야 하기 때문이다.


40 삽입




참고했던 링크들 https://junboom.tistory.com/18 https://zeddios.tistory.com/237 https://coding6467.tistory.com/11 https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
Last updated
Was this helpful?