
이진 탐색 트리(Binary Search Tree, 이하 BST)는 이진 트리의 한 종류로, 각 노드가 최대 두 개의 자식을 가지며, 특정한 규칙을 따라 정렬된 트리입니다. BST는 빠른 탐색, 삽입, 삭제가 가능하여 다양한 알고리즘과 데이터 구조에서 자주 사용됩니다.
BST는 다음 규칙을 따르는 트리입니다:
예시: 루트 노드가 15일 때, 왼쪽 자식은 10보다 작고, 오른쪽 자식은 20보다 큽니다.
루트 노드에서 시작하여 찾고자 하는 값과 비교합니다.
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def search(node, key):
if node is None or node.value == key:
return node is not None
if key < node.value:
return search(node.left, key)
return search(node.right, key)
# 예시 실행
root = Node(15)
root.left = Node(10)
root.right = Node(20)
print(search(root, 10)) # 출력: True
print(search(root, 25)) # 출력: False
적절한 위치를 찾아 재귀적으로 탐색한 후 새 노드를 삽입합니다.
def insert(node, key):
if node is None:
return Node(key)
if key < node.value:
node.left = insert(node.left, key)
else:
node.right = insert(node.right, key)
return node
# 예시 실행
root = insert(None, 15)
insert(root, 10)
insert(root, 20)
insert(root, 25)
삭제는 세 가지 경우로 나뉩니다:
자식이 없는 노드 삭제.
자식이 하나인 노드 삭제.
자식이 둘인 노드는 오른쪽 서브트리에서 가장 작은 값으로 대체합니다.
def find_min(node):
while node.left is not None:
node = node.left
return node
def delete(node, key):
if node is None:
return node
if key < node.value:
node.left = delete(node.left, key)
elif key > node.value:
node.right = delete(node.right, key)
else:
if node.left is None:
return node.right
elif node.right is None:
return node.left
temp = find_min(node.right)
node.value = temp.value
node.right = delete(node.right, temp.value)
return node
# 예시 실행
root = insert(None, 15)
insert(root, 10)
insert(root, 20)
root = delete(root, 15)
| 연산 | 평균 시간 복잡도 | 최악의 시간 복잡도 (편향 트리 시) |
|---|---|---|
| 탐색 | O(log n) | O(n) |
| 삽입 | O(log n) | O(n) |
| 삭제 | O(log n) | O(n) |
BST가 편향될 경우 성능 저하가 발생할 수 있습니다. 이를 보완하기 위해 AVL 트리와 같은 균형 이진 탐색 트리를 사용합니다.
| 구분 | BST | AVL 트리 |
|---|---|---|
| 균형 여부 | 보장하지 않음 | 항상 균형 유지 |
| 시간 복잡도 | 최악 O(n) | O(log n) |
| 삽입/삭제 | 빠름 | 균형 유지 비용 발생 |