⇒ 노드 두개를 매개변수로 넣고, 노드의 부모를 교체한다!
교체되는 노드(부모 없어짐) : u
교체할 노드 (부모 변경): v
u
노드의 부모가 nil이라면 (= u
노드가 루트노드라면) v
노드를 루트노드로 바꿔준다.u
노드가 부모의 왼쪽 자식이라면, u
노드의 부모의 왼쪽 자식을 v
노드로 바꿔준다.u
노드가 부모의 오른쪽 자식이라면, u
노드의 부모의 오른쪽 자식을 v
노드로 바꿔준다.v
노드의 부모를 u
노드의 부모로 바꿔준다.z
**와 그 자리에 올릴 후계자 노드 **y
**를 설정합니다. 또한 **y
**의 원래 색상을 **y_original_color
**에 저장한다.z
**의 왼쪽 자식이 **t->nil
**인 경우, 즉 왼쪽 자식이 없는 경우, **z
**를 그 오른쪽 자식으로 대체한다.z
**의 오른쪽 자식이 **t->nil
**인 경우, 즉 오른쪽 자식이 없는 경우, **z
**를 그 왼쪽 자식으로 대체한다.z
**가 양쪽 자식을 모두 가진 경우, **z
**의 오른쪽 서브트리에서 최소값을 가진 노드를 찾아 **y
**에 할당합니다. 이후 **y
**의 원래 색상을 **y_original_color
**에 저장하고, **y
**의 오른쪽 자식을 **x
**로 설정한다.y
**의 부모가 **z
**인 경우, **x
**의 부모를 **y
**로 설정한다. 그렇지 않은 경우, **y
**를 그 자리에 대체한 후 **y
**의 오른쪽 자식을 **y
**로 연결한다.z
**를 **y
**로 대체한 후, **y
**의 왼쪽 자식을 **z
**의 왼쪽 자식으로 설정하고, **y
**의 색상을 **z
**의 색상으로 설정합니다. 그 후 **z
**를 해제한다.y
**의 원래 색상이 검은색이었다면, rbtree_delete_fixup
함수를 호출하여 레드-블랙 트리의 규칙을 복구한다.