들어가기 전에
레드 블랙 트리 규칙을 만족하는지 확인하고 색상 전환을 하는 색상 확인 메소드에 대해 알아보도록 하겠습니다.
학습 목표
레드 블랙 트리의 색상 확인 메소드를 이해할 수 있습니다.
핵심 단어
- 레드 블랙 트리
- 색상 확인 메소드
강의 듣기
들어가기 전에
레드 블랙 트리 규칙을 만족하는지 확인하고 색상 전환을 하는 색상 확인 메소드에 대해 알아보도록 하겠습니다.
학습 목표
레드 블랙 트리의 색상 확인 메소드를 이해할 수 있습니다.
핵심 단어
강의 듣기
색상 확인 메소드
노드를 트리의 규칙에 맞게 추가한 후, 2-1강에서 배운 레드 블랙 트리의 6가지 규칙을 만족하는지 확인해주어야 합니다.
public void checkColor(Node<K,V> node){
// 루트는 항상 검은색이므로 색을 확인할 필요가 없습니다.
if (node == root)
return;
// 빨간 노드 2개가 연속으로 나오는 경우 (레드 블랙 트리 규칙 위반)
if (!node.black && !node.parent.black){
correctTree(node);
// 부모 노드를 계속 확인합니다.
checkColor(node.parent);
}
public void correctTree(Node<K,V> node){
// node의 부모 노드가 왼쪽 자식이면 이모 노드는 조부모 노드의 오른쪽 자식입니다.
if (node.parent.isLeftChild) {
// 이모 노드가 검은색 (이모 노드가 비어있는 경우 포함)
if(node.parent.parent.right == null || node.parent.parent.right.black)
// 회전
return rotate(node);
// 이모 노드가 빨간색
if (node.parent.parent.right != null)
// 색상 변환
node.parent.parent.right.black = true;
node.parent.parent.black = false;
node.parent.black = true;
return;
}
// node의 부모 노드가 오른쪽 자식이면 이모 노드는 조부모 노드의 왼쪽 자식입니다.
// 위 코드와 동일하게 하되, 이모 노드를 node.parent.parent.left로 바꿉니다.
else {
// 이모 노드가 검은색 (이모 노드가 비어있는 경우 포함)
if(node.parent.parent.left == null || node.parent.parent.left.black)
// 회전
return rotate(node);
// 이모 노드가 빨간색
if (node.parent.parent.left != null)
// 색상 변환
node.parent.parent.left.black = true;
node.parent.parent.black = false;
node.parent.black = true;
return;
}
생각해보기
1) correctTree 메소드는 어떤 일을 하나요?
comment
여러 메서드에서 동일하게 node라는 입력을 받아서 메서드에서 다루는 node가 어떤 위치의 노드인지 헷갈릴 수가 있습니다
checkColor 메서드에서 받는 node는 add 메서드가 실행되고 새로운 노드가 트리에 삽입된 뒤에 삽입된 노드를 기점으로 실행됩니다
삽입된 노드부터 checkColor를 실행하다가 violation이 발견되면 two red 에서 자식 red 위치에 있는 노드를 correctTree에 넘겨주게 됩니다
correctTree에서 two red 중 자식 red에 대해 진행되다가 rotate에도 자식 red 위치에 있는 노드를 건네주게 됩니다
rotate 메서드 강의에서 나오겠지만 rotate 메서드에서 어떤 회전을 할지 결정한 후에 세부 회전 메서드에 two red 중 자식 red의 조부모에 해당하는 노드를 건내주게 됩니다
제가 생각하기에 세가지 정도의 문제점이 있는데 맞는지 확신은 못하겠습니다
1. 0:20에 교수님이 우리가 트리를 수정할때마다 root를 black으로 다시 만들어줘야 한다고 했는데 코드에 넣지 않으셨습니다
// 색상 변환 코드의 뒤에 root.black = true;를 매번 삽입해 주어야 color flip 이후 루트가 red가 되는 것을 방지합니다
2. checkColor 메서드 안에서 violation이 발견되어 correctTree를 수행하고 난 뒤에 checkColor를 수행하는 위치의 노드가 루트가 되는 경우가 생깁니다
그러나 그 뒤에 checkColor(node.parent)를 하게 되는데 root의 parent는 null이므로 null에 대해 checkColor를 수행하게 되면 NullPointerException를 마주치게 됩니다
그러므로 마지막 줄에 재귀로 수행하는 checkColor(node.parent)를 if (node.parent != null) 조건문 안에 넣어주어야 할것 같습니다
3. 큰 문제는 아니지만 // 이모 노드가 빨간색 부분에서 그 코드 들에서 이모 노드가 null 이거나, 존재하며 검은색인 경우를 확인 했기 때문에 자동적으로 이모 노드가 존재하고 빨간색일 수밖에 없습니다
그러므로 if 문으로 이모 노드에 대한 검사를 따로 수행하지 않아도 될것 같습니다
어떤 경로에서도 빨간색 노드 2개가 연속으로 있어선 안된다. 즉, 빨간색의 자식은 모두 검은색이여야 한다.의 규칙이 만족되지 않았을 때 해당 노드의 이모 노드 색깔을 파악한 후, 회전 또는 색상 변환을 수행한다.