노드를 삭제하거나 삽입할 때 트리를 수정하기 때문에 레드블랙 트리의 특성을 위반할 수 있다.
이러한 특성을 복구하기 위해 트리 내의 일부 노드들의 색깔과 포인터를 변경해야 한다.
노드 x에 대해서 좌회전을 할 때 오른쪽 자식은 NIL이 아니라고 가정
노드 x와 노드 y가 연결된 축을 기준으로 회전
노드 y는 서브트리의 새로운 루트가 됨
노드 x는 노드 y의 왼쪽 자식이 됨
y의 왼쪽 자식이였던 는 노드 x의 오른쪽 자식이 됨
y를 x의 오른쪽 노드라고 변수에 담기
y의 왼쪽 서브트리를 x의 오른쪽으로 옮김
옮긴 트리의 부모도 x로 지정
x의 부모를 y와 연결
노드 x와 노드 y가 연결된 축을 기준으로 회전
노드 x가 새로운 서브트리의 루트가 됨
노드 y는 노드 x의 오른쪽 자식이 됨
노드 x의 오른쪽 자식이였던 는 노드 y의 왼쪽 자식이 됨
x를 y의 왼쪽 노드라고 변수에 담기
y의 왼쪽 서브트리를 x의 오른쪽으로 옮김
옮긴 트리의 부모도 x로 지정
x의 부모를 y와 연결
4번 속성을 위반했을 때
G(할아버지), P(부모), U(삼촌), new node(새로운 노드)
case 3에서 왼쪽과 오른쪽을 변경해도 성립한다. (왼쪽 → 오른쪽) / (오른쪽 → 왼쪽)
할아버지 노드와 부모노드와 삽입한 새로운 노드가 꺾인 형태이면 회전을 통해 일직선으로
펴준다음에 case 3방식으로 해결
Case3와 마찬가지로 왼쪽과 오른쪽 방향을 바꿔도 성립
삽입 전 rb트리 속성을 만족한 상태
삽입하는 노드의 색은 항상 red
왜? → 삽입 후에도 5번 속성을 만족하기 위해서
속성 위반 여부를 확인하는 방법은 삭제되는 색을 통해
(두 경우 다 유효한 값을 가지는 자녀를 의미)
삭제하려는 노드의 자녀가 없거나 하나라면
→ 삭제되는 색은 삭제되는 노드의 색
삭제하려는 노드의 자녀가 둘이라면
→ 삭제되는 색은 삭제되는 노드의 successor의 색
successor: 삭제할려는 노드의 오른쪽 서브트리에서 가장 작은 값
삭제되는 색이 red라면 어떠한 속성도 위반하지 않는다.
삭제되는 색이 black이라면 2,4,5번 속성을 위반할 수 있다.
red-and-black일 경우: black으로 바꾸면 해결
doubly black일 경우: 4가지의 경우가 있음
→4가지로 분류된 기준은 doubly black의 형제의 색과 그 형제의 자녀들의 색임
case 4: doubly black의 오른쪽 형제가 black & 그 형제의 오른쪽 자녀가 red
→ red를 doubly black 위로 옮기고 옮긴 red로 extra black을 전달해서 red-and-black으로 만들면 red-and-black을 black으로 바꿔서 해결
red를 왼쪽으로 보내기 위해서는 d의 위치가 red가 되어야함
red가 왼쪽으로 넘어갈 수 있도록 왼쪽으로 회전 전에 b와 d의 색을 바꿔준다.
B를 기준으로 왼쪽으로 회전한다.
A와 C의 extra black을 모아 부모로 전달해 B를 black으로 만들어 문제를 해결한다.
결과론적으로
오른쪽 형제(D)는 부모의 색으로
오른쪽 형제의 오른쪽 자녀(E)는 black으로
부모는 black으로 바꾼 후에 부모를 기준으로 왼쪽 회전하면 해결
오른쪽 왼쪽을 바꿔도 성립
case 3: doubly black의 오른쪽 형제가 black & 그 형제의 왼쪽 자녀가 red & 그 형제의 오른쪽 자녀가 black일 때
→ doubly black의 형제의 오른쪽 자녀가 red가 되게 만들어서 이후에 case 4를 적용하면 해결!
E 위치에 red가 오게 만들려면 C와 D의 색을 바꾼 후 D를 기준으로 오른쪽 회전하면 된다.
case 2: doubly black의 형제가 black & 그 형제의 두 자녀 모두 black
doubly black과 그 형제의 black을 모아서 부모에게 전달 후 부모가 extra black을 해결하도록 위임
case 1: doubly black의 형제가 red일 때
부모와 형제의 색을 바꾸고 부모를 기준으로 왼쪽 회전한 뒤 doubly black을 기준으로 case 2,3,4 중 하나로 해결