1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class BinarySearchTree:
...
def delete(self, key):
self.root, deleted = self._delete_value(self.root, key)
return deleted
def _delete_value(self, node, key):
if node is None:
return node, False
deleted = False
# 해당 노드가 삭제할 노드일 경우
if key == node.data:
deleted = True
# 삭제할 노드가 자식이 두개일 경우
if node.left and node.right:
# 오른쪽 서브 트리에서 가장 왼쪽에 있는 노드를 찾고 교체
parent, child = node, node.right
while child.left is not None:
parent, child = child, child.left
child.left = node.left
if parent != node:
parent.left = child.right
child.right = node.right
node = child
# 자식 노드가 하나일 경우 해당 노드와 교체
elif node.left or node.right:
node = node.left or node.right
# 자식 노드가 없을 경우 그냥 삭제
else:
node = None
elif key < node.data:
node.left, deleted = self._delete_value(node.left, key)
else:
node.right, deleted = self._delete_value(node.right, key)
return node, deleted
|