이진 탐색 트리(BST)는 이진 트리의 일종으로, 왼쪽 서브트리에는 현재 노드보다 작은 값, 오른쪽 서브트리에는 현재 노드보다 큰 값이 위치하는 구조를 가진다.
이러한 규칙 덕분에 데이터를 빠르게 탐색할 수 있으며, 정렬된 데이터를 다룰 때 매우 유용하게 사용된다.
다음과 같은 숫자들이 순서대로 삽입될 경우:
10 → 5 → 15 → 3 → 7 → 13 → 18
구성되는 트리 구조는 아래와 같다.
10
/ \
5 15
/ \ / \
3 7 13 18
삭제는 총 3가지 경우로 나뉜다.
class Node:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
# BST 삽입
def insert(node, key):
if node is None:
return Node(key)
if key < node.key:
node.left = insert(node.left, key)
elif key > node.key:
node.right = insert(node.right, key)
return node
# BST 탐색
def search(node, key):
if node is None or node.key == key:
return node
if key < node.key:
return search(node.left, key)
else:
return search(node.right, key)
# 중위 순회 (오름차순 출력)
def inorder(node):
if node:
inorder(node.left)
print(node.key, end=' ')
inorder(node.right)
# 최소값 찾기 (삭제 연산에 필요)
def find_min(node):
while node.left:
node = node.left
return node
# BST 삭제
def delete(node, key):
if node is None:
return None
if key < node.key:
node.left = delete(node.left, key)
elif key > node.key:
node.right = delete(node.right, key)
else:
# case 1: no child
if node.left is None and node.right is None:
return None
# case 2: one child
if node.left is None:
return node.right
elif node.right is None:
return node.left
# case 3: two children
successor = find_min(node.right)
node.key = successor.key
node.right = delete(node.right, successor.key)
return node
# 실행 예시
root = None
for num in [10, 5, 15, 3, 7, 13, 18]:
root = insert(root, num)
print("Inorder Traversal:")
inorder(root) # 출력: 3 5 7 10 13 15 18
# 탐색
print("\n\nSearch 13:")
found = search(root, 13)
print("Found!" if found else "Not found")
# 삭제
root = delete(root, 10)
print("\nInorder after deleting 10:")
inorder(root)