https://www.boostcourse.org/cs204
자료구조 강의를 듣고 정리한 내용입니다
adding data
균형이 맞아야한다는 규칙에 따른 트리 생성
어떤 종류의 회전을 했는지 기입하고 트리의 상태를 항상 그려야 한다
-> 트리가 균형이 맞는지 확인하는 과정에서 필요하다
트리의 균형을 맞추는 또 다른 방식
레드 블랙 트리
모든 노드를 빨강 또는 검정으로 설정한다
새로운 요소를 추가 할 때 마다 규칙을 확인한다
트리의 규칙(중요)
- 모든 노드는 빨간색이거나 검은색이다
- 루트는 항상 검은색이다 //아닐시 강제로 변환
- 새로 추가되는 노드는 항상 빨간색이다 //빨강 -> 검정
- 루트에서 잎 노드로 가는 모든 경로 (== 트리에서 만들 수 있는 모든 경로)는 같은 수의 검은색 노드가 있어야 한다
- 어떤 경로에서도 빨간색 노드 두 개가 연속적으로 있어서는 안 된다. //검은색은 중복 가능
- 모든 빈 노드는 검은색이라고 가정한다
균형을 맞추는 방법
트리의 규칙이 어긋나게되어 트리를 고치는 경우
고치기 위한 규칙 == 트리의 균형을 다시 맞추기 위한 규칙이다
1. 이모 노드가 검은색인 경우
회전을 한다.
회전을 하고나면 부모 노드는 검은색, 두 자식 노드는 빨간색이 되야한다.
2. 이모 노드가 빨간색인 경우
색상을 전환한다.
색상을 바꾸면 부모 노드는 빨간색, 두 자식 노드는 검은색이 되어야 한다.
레드블랙트리는 회전 여부를 노드의 색깔로 파악해야 한다
-> boolean으로 판별
이모 노드를 알아내기 위해 left, right, parent 노드를 가리키는 포인터와
불리언 값을 가진 isLeftChild를 사용한다
레드블랙트리 코드
//레드블랙트리 클래스
public class RedBlackTree<K, V> implements RedBlackI<K, V> }
Node<K, V> root;
int size;
public Node<K, V> {
K key;
V value;
Node<K, V> left, right, parent; //부모가 null이면 root노드이다
boolean isLeftChild, black;
public Node(K key, V value) { //생성자를 정의할 때는 제네릭 x
this.key = key;
this.value = value;
left = right = parent = null; //노드 초기화
black = false;
isLeftChild = false;
}
//add 메서드
public void add(K key, V value) {
Node<K, V> node = new Node<K, V>(key, value);
if(root == null) {
root = node;
root.black = true;
size++;
return;
}
add(root, node) // 트리에 노드가 있을 경우 재귀 메소드 사용
size++;
}
// add 재귀함수, 내부클래스
public void add(Node<K, V> parent, Node<K, V> newNode) {
//추가할 노드와 현재 노드의 크기 비교
If(((Comparable<K>)newNode.key).compareTo(parent.key) > 0) {
If(parent.right == null) { //오른쪽 노드
parent.right = newNode;
newNode.parent = parent;
newNode.isLeftChild = false;
}
return add(parent.right, newNode);
}
If(parent.left == null) { //왼쪽 노드
parent.left = newNode;
newNode.parent = parent;
newNode.isLeftChild = true;
return;
}
return add(parent.left, newNode);
checkColor(newNode); // 레드 블랙 트리가 규칙에 맞게 잘 되어있는지 확인
}
트리를 조작할 때의 규칙
노드의 이모노드가 black이고 boolean이 true이면 회전시킨다
회전을 할 때 조부모의 왼쪽 자식의 왼쪽 서브트리에서 문제가 발생했다면
우측 회전을 하면 된다
문제가 발생한 지점이 오른쪽 트리인 경우에는 좌측 회전을 한다
-> 다른 트리의 회전 규칙과 똑같다
'CS지식 > 자료구조' 카테고리의 다른 글
TIL 정리_92(레드블랙트리(2)) (0) | 2022.05.19 |
---|---|
TIL 정리_90 (0) | 2022.05.17 |
TIL 정리_89 (0) | 2022.05.16 |
TIL 정리_88 (0) | 2022.05.15 |
TIL 정리_87(자료구조) (0) | 2022.05.14 |