코드 8-6
def __delete_recursion(self, cur, target):
if not cur:
return None
elif target < cur.key: ➊
new_left = self.__delete_recursion(cur.left, target)
self.__make_left(cur, new_left)
elif target > cur.key: ➋
new_right = self.__delete_recursion(cur.right, target)
self.__make_right(cur, new_right)
else: ➌
if not cur.left and not cur.right: ➍
cur = None
elif not cur.right: ➎
cur = cur.left
elif not cur.left: ➏
cur = cur.right
else: ➐
replace = cur.left
replace = self.max(replace)
cur.key, replace.key = replace.key, cur.key
new_left = self.__delete_recursion(cur.left, replace.key)
self.__make_left(cur, new_left)
return cur
def delete(self, target):
new_root = self.__delete_recursion(self.root, target)
self.root = new_root
➊ 삭제하려는 노드가 현재 노드보다 작을 때
➋ 삭제하려는 노드가 현재 노드보다 클 때
➌ 삭제하려는 노드를 찾았을 때
➍ 리프 노드일 때
➎ 자식이 하나일 때 왼쪽 자식만 있을 때
➏ 자식이 하나일 때 오른쪽 자식만 있을 때
➐ 자식이 둘일 때