이진탐색트리(Binary Search Tree, BST)

ORCASUIT·2023년 11월 6일

이진탐색트리(Binary Search Tree, BST)는 이진트리의 일종으로, 다음과 같은 특성을 가진 자료구조입니다:

  1. 각 노드는 하나의 키(데이터)를 가집니다.
  2. 각 노드의 왼쪽 서브트리에 있는 모든 노드의 키는 그 노드의 키보다 작습니다.
  3. 각 노드의 오른쪽 서브트리에 있는 모든 노드의 키는 그 노드의 키보다 큽니다.
  4. 왼쪽과 오른쪽 서브트리도 이진탐색트리입니다.
  5. 중복된 키를 허용하지 않습니다.

이진탐색트리의 주요 연산에는 데이터의 삽입, 검색, 삭제 등이 있으며, 각 연산의 평균 시간 복잡도는 (O(\log n))입니다. 그러나 트리가 한쪽으로 치우쳐 성장할 경우 최악의 시간 복잡도는 (O(n))에 이를 수 있습니다.

삽입 연산

새로운 키를 삽입할 때, 트리를 루트에서부터 시작하여 다음과 같은 규칙으로 적절한 위치를 찾아 삽입합니다:

  1. 삽입하려는 키를 루트 키와 비교합니다.
  2. 키가 루트 키보다 작으면 왼쪽 서브트리로, 크면 오른쪽 서브트리로 이동합니다.
  3. 이 과정을 서브트리에서 재귀적으로 반복합니다.
  4. 삽입할 위치에 도달하면 새 노드를 생성하여 키를 저장합니다.

검색 연산

특정 키를 검색할 때는 루트에서 시작하여 다음과 같은 규칙으로 키를 찾습니다:

  1. 검색하려는 키를 루트 키와 비교합니다.
  2. 키가 루트 키와 일치하면 검색 성공입니다.
  3. 키가 루트 키보다 작으면 왼쪽 서브트리에서 검색을 계속하고, 크면 오른쪽 서브트리에서 검색을 계속합니다.
  4. 해당 키를 찾거나, 리프 노드에 도달할 때까지 이 과정을 반복합니다.

삭제 연산

노드를 삭제할 때는 세 가지 경우를 고려해야 합니다:

  1. 리프 노드 삭제: 삭제하려는 노드가 리프 노드인 경우, 단순히 노드를 제거합니다.
  2. 한 개의 자식을 가진 노드 삭제: 삭제하려는 노드가 한 개의 자식만 가진 경우, 자식 노드를 삭제된 노드의 부모 노드와 연결합니다.
  3. 두 개의 자식을 가진 노드 삭제: 가장 복잡한 경우로, 삭제하려는 노드의 왼쪽 서브트리에서 가장 큰 값을 가진 노드 또는 오른쪽 서브트리에서 가장 작은 값을 가진 노드를 찾아 삭제하려는 노드의 위치로 옮깁니다. 이를 위해서는 후계자를 찾고, 후계자의 원래 위치에서 삭제 과정을 재귀적으로 수행해야 합니다.

이진탐색트리는 중간 크기의 데이터를 다룰 때 효율적이고, 데이터가 동적으로 변화하는 상황에 적합합니다. 데이터베이스 시스템이나 파일 시스템의 인덱스와 같은 곳에서 사용됩니다.

프로그래밍을 배우는 단계에서 이진탐색트리는 자료구조와 알고리즘의 기본적인 이해를 돕고, 재귀적 사고를 훈련하는 데 도움을 줍니다. BST의 삽입, 검색, 삭제 연산을 구현하는 것은 프로그래밍 기술을 향상시키는 좋은 연습이 됩니다.

0개의 댓글