삽입과 탐색 과정은 비교적 간단하지만 삭제과정은 삭제한 노드를 다른 노드로 대체해야하기 때문에 복잡하다. 삭제과정만 정리한다.
삭제할 노드를 발견했다면 그 노드의 child노드를 확인한다. 자세한 코드는 아래의 delete 함수를 보자.
class Node(object):
def __init__(self, data):
self.data = data
self.left = self.right = None
class BinarySearchTree(object):
def __init__(self):
self.root = None
def insert(self, data):
self.root = self._insert_value(self.root, data)
return self.root is not None
def _insert_value(self, node, data):
if node is None:
node = Node(data)
else:
if data <= node.data:
node.left = self._insert_value(node.left, data)
else:
node.right = self._insert_value(node.right, data)
return node
def find(self, key):
return self._find_value(self.root, key)
def _find_value(self, root, key):
if root is None or root.data == key:
return root is not None
elif key < root.data:
return self._find_value(root.left, key)
else:
return self._find_value(root.right, key)
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
bst = BinarySearchTree()
print(bst.insert(1))
print(bst.insert(2))
print(bst.insert(3))
print(bst.insert(4))
print()
print(bst.find(0))
print(bst.find(2))
print(bst.find(4))
print(bst.find(6))
print()
print(bst.delete(0))
print(bst.delete(2))
print(bst.delete(4))
print(bst.delete(6))
Binary Search Tree의 Data Type을 일반화했다.
doxygen형식으로 주석을 상세하게 작성하였다.