레드 블랙트리의 속성 복습하기!
- 루트 노드는 Black
- Red 의 자녀들은 Black ( = Red 는 연속적으로 존재할 수 없다 )
- 임의의 노드에서 자손 nill 노드들까지 가는 경로들의 Black 수는 같다 ( 자기 자신은 카운트에서 제외 )
RB 트리에서 노드를 삭제할 때 어떤 색이 삭제 되는지가 속성 위반 여부 를 확인할 때 매우 중요
삭제하려는 노드의 자녀(Nil 노드 제외) = 없다/1개
: 삭제되는 색 = 삭제되는 노드의 색
삭제하려는 노드의 자녀 = 2개
: 삭제되는 색 = 삭제되는 노드의 successor 의 색
- 삭제되는 색 = Red
: 어떠한 속성도 위반하지 않음
- 삭제되는 색 = Black
:#2
,#4
,#5
속성 위반할 수 있다
#2
속성 위반 (삭제 색 = Black)#5
속성 위반 (삭제 색 = Black)
: 삭제되는 색이 Black 일때 특수한 상황을 제외하면 #5
속성을 항상 위반
해결 : #5
속성을 다시 만족시키기 위해 삭제 색의 위치를 대체한 노드에 extra black
을 부여
extra black
을 부여받은 노드는 doubly black
, red-and-black
이 된다.
extra black
해결red-and-black
을 Black 으로 바꾸기
#4
, #5
를 위반한 것을 동시에 해결doubly black
해결
총 4가지 Case 로 분류하며,
그 기준은doubly black
의 형제 색 과 그 형제들의 자녀들의 색
역할 : 경로에서 black 수를 카운트 할 때, 하나의 black으로 카운트
위치 : 삭제된 색의 위치를 대체한 노드에 extra black
부여
doubly black : extra black
이 부여된 black 노드
red-and-black : extra black
이 부여된 red 노드
: doubly black의 오른쪽 형제가 Black
& 그 형제의 오른쪽 자녀가 Red 일때
: doubly black
의 오른쪽 형제가 Black
& 그 형제의 왼쪽 자녀가 Red 일때
& 그 형제의 오른쪽 자녀가 Black 일때
doubly black
의 오른쪽 형제와 Red 자녀 색을 바꿔주기doubly black
의 오른쪽 형제를 기준으로 오른쪽으로 회전: doubly black
의 형제가 Black
& 그 형제의 두 자녀 모두 Black
red-and-black
혹은doubly black
red-and-black
or 루트노드
-> Black 으로 바꿔주기doubly black
-> Case 1,2,3,4 중 하나로 해결: doubly black
의 형제가 Red 일때
doubly black
을 기준으로 Case 2, 3, 4 중 하나로 해결