일명 RB Tree라고 불린다. 이는 BST(Binary Search Tree)를 기반으로 하는 트리 형식의 자료구조이다.
BST의 단점은 무엇이였냐면 편향적으로 트리구조가 되어있다면 결국 Array와 다를바없이 Search시간이 O(n)의 시간이 걸리게 된다. 이 단점을 극복한게 RB Tree와 AVL Tree가 있다.
이 중에서 Java Collection의 ArrayList, HashMap에서 Separate Chaining 에서 쓰이는 RB Tree에 대해서 알아보자.
RB Tree는 Search, Insert, Delete시에 O(log n)이 걸린다. 동일한 노드의 개수일 때 depth를 최소화하여 시간 복잡도를 줄이는 것이 핵심 아이디어이다.
⇒ 동일한 노드일 때 depth를 최소화하는 방법은 트리 구조가 complete binary tree
인 경우이다.
Black-Height
라고 한다. Root노드는 Black이고, 추가되는 노드들은 무조건 Red이다.
그러면 4. 어떤 노드의 색깔이 Red 라면 두 개의 children의 색깔은 모두 Black이다.
를 위반할 수 있다.
이걸 어떤 식으로 해결할까?
2가지의 전략을 이용해 해결한다.
바로 Restructuring , Recoloring 이다.
내 부모의 형제(삼촌)가 Black일 경우에 진행한다.
부모
로 설정하고, 나머지는 자식 노드
로 설정한다.부모
를 검정색으로 변경한 뒤, 자식 노드
들을 빨간색으로 변경한다.음.. 생각하자면 트리를 회전한다고 생각하면 된다. 오른쪽으로 기울어져 있으면 왼쪽으로 회전, 왼쪽으로 기울어져 있으면 오른쪽으로 회전한다고 생각하자.
내 부모의 형제(삼촌)가 Red일 경우에 진행한다.
그냥 해당 노드를 삭제하면 된다. 제일 간단한 경우.
검정색 노드를 삭제할 땐 여러가지를 해당 경우를 따져봐야한다.
현재 노드를 삭제한 후, 자식을 검정색 노드로 변경하면 된다.
삭제 노드를 없애면 5. 각 노드에 대해서 노드로부터 descendant leves까지의 단순 경로는 모두 같은 수의 Black nodes들을 포함하고 있다.
에 대해 위반하게 된다. Black Nodes의 개수가 달라지는 것이다.
그렇기 때문에 부모의 서브트리 2개를 동시에 봐야한다.
그림으로 보는게 편하기 때문에
https://assortrock.com/88
https://itstory.tk/entry/레드블랙-트리Red-black-tree
여기를 참고하는게 좋아보인다. 나중에 시간이 나면 정리해야겠다.
RB Tree에 대해서 잘 이해가 안간다면 해당 사이트에서 직접 해보면 이해에 도움이 될 것이다.
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
참고
https://lemonlemon.tistory.com/135
https://nesoy.github.io/articles/2018-08/Algorithm-RedblackTree
https://zeddios.tistory.com/237
https://itstory.tk/entry/레드블랙-트리Red-black-tree
https://assortrock.com/88