모든 노드는 red 혹은 black
루트 노드는 black
모든 nil(leaf) 노드는 black
red의 자녀들은 black 혹은 red가 연속적으로 존재할 수 없다.
임의의(아무) 노드에서 자손 nil 노드들까지 가는 경로들의 black 수는 같다.(자기 자신은 카운트에서 제외)
노드 x의 black height
노드 x에서 임의의 자손 nil 노드까지 내려가는 경로에서의 black 수(자기 자신은 카운트에서 제외)
5번째 속성을 만족해야 성립하는 개념
색을 바꾸면서도 5번 속성 유지하기
rb트리가 5번 속성을 만족하고 있고 두 자녀가 같은 색을 가질 때 부모와 두 자녀의 색을 바꿔줘도 5번 속성은 여전히 만족한다. → 삽입과 삭제를 할때 이 속성이 사용됨
삭제 전 RB트리 속성을 만족한 상태
삭제 방식은 일반적인 BST와 동일
삭제 후 RB 트리 속성 위반 여부 확인
RB트리 속성을 위반했다면 재조정
RB트리 속성을 다시 만족
결국은 RB트리에서 노드를 삭제할 때 어떤 색이 삭제되는지가 속성 위반 여부를 확인할 때 매우 중요하다.
삭제되는 색 = 삭제되는 노드의 색
삭제되는 노드의 successor의 색
삭제되는 색이 black일 때 특수한 상황을 제외하면 #5 속성을 항상 위반하게 된다.
(특수한 상황은 루트노드가 black인데 그것이 제거될때이다.)
#5속성을 다시 만족시키기 위해 삭제된 색의 위치를 대체한 노드에 extra black을 부여한다.
경로에서 black을 카운트할 때 extra black은 하나의 black으로 카운트된다.
extra black을 부여받은 노드는 doubly black이 되거나 red-and-black이 된다.
red-and-black을 black으로 바꾸면 해결
위의 그래프에서 30을 삭제한다고 가정해보자
30은 자녀가 하나라서 삭제되는 색은 30의 black이다. → #5 위반
20과 25가 바로 연결된다. → #4 위반
삭제되는 색은 30의 black이었고, 30을 대체하는 25의 red에 extra black을 부여한다.
25는 red-and-black이 됐으니 25를 black으로 바꿔주면 종료된다.
그럼 #4, #5를 위반한 것을 동시에 해결할수있다.
doubly black의 extra black을 없애는 방법은 총 4가지 case로 분류된다.
4가지 case로 분류할때의 기준은 doubly black의 형제의 색과 그 형제의 자녀들의 색이다.
doubly black의 오른쪽 형제가 black & 그 형제의 오른쪽 자녀가 red일 때
오른쪽 형제는 부모의 색으로,
오른쪽 형제의 오른쪽 자녀는 black으로,
부모는 black으로 바꾼 후에
부모를 기준으로 왼쪽으로 회전하면 해결된다.
doubly black의 오른쪽 형제가 black & 그 형제의 왼쪽 자녀가 red & 그 형제의 오른쪽 자녀는 black일때
doubly black의 형제의 오른쪽 자녀를 red가 되게 만들어서
이후에 case 4를 적용하여 해결
doubly black의 형제가 black & 그 형제의 두 자녀가 모두 black일 때
doubly black과 그 형제의 black을 모아서 부모에게 전달해서
부모가 extra black을 해결하도록 위임한다.
doubly black의 형제가 red일때
부모와 형제의 색을 바꾸고 부모를 기준으로 왼쪽으로 회전한 뒤
doubly black을 기준으로 case 2,3,4 중에 하나로 해결
점점 추워진다. 🥶
전기장판을 살까..