[자료구조] Binary search tree

  

이진 탐색 트리 (Binary Search Tree)

이진 탐색 트리(Binary Search Tree, BST)는 각 노드에 키(key)를 저장하는 트리 형태의 자료구조다. BST는 다음 특징을 가진다.

  1. 이진 트리(Binary Tree): 각 노드는 최대 두 개의 자식 노드를 가질 수 있다.
  2. 탐색 트리(Search Tree): 각 노드의 키 값은 왼쪽 서브트리의 모든 키 값보다 크고, 오른쪽 서브트리의 모든 키 값보다 작다.

BST의 장점

  • 검색 효율: 탐색 트리의 특성상, 이진 탐색과 유사하게 O(log n) 시간 복잡도로 원하는 키를 찾을 수 있다.
  • 순서 : 중위 순회(inorder traversal)를 통해 키 값을 정렬된 순서로 얻을 수 있다.
  • 동적 자료구조: 삽입 및 삭제 연산을 효율적으로 수행할 수 있다.

BST의 주요 연산

1. Search (탐색)

BST에서 특정 키 값을 가진 노드를 찾는 과정이다. root 노드에서 시작하여, 찾는 키 값과 현재 노드의 키 값을 비교하며 왼쪽 또는 오른쪽 서브트리로 이동한다.

예시: 키 값 4 탐색

  1. root 노드(6)에서 시작하여, 4 < 6 이므로 왼쪽 서브트리로 이동한다.
  2. 현재 노드(2)에서, 4 > 2 이므로 오른쪽 서브트리로 이동한다.
  3. 현재 노드(4)에서, 4 = 4 이므로 탐색 완료.

2. Insertion (삽입)

BST에 새로운 key-value 쌍을 추가하는 과정이다. 먼저 탐색 과정과 동일하게 삽입할 위치를 찾는다. 만약 찾는 키 값이 이미 존재하면 값을 갱신하고, 그렇지 않으면 새로운 노드를 생성하여 삽입한다.

예시: 키 값 5 삽입

  1. 루트 노드(6)에서 시작하여, 5 < 6 이므로 왼쪽 서브트리로 이동한다.
  2. 현재 노드(2)에서, 5 > 2 이므로 오른쪽 서브트리로 이동한다.
  3. 현재 노드(4)에서, 5 > 4 이지만 오른쪽 자식 노드가 없으므로, 오른쪽에 새로운 노드(5)를 생성하여 삽입한다.

3. Deletion (삭제)

BST에서 특정 키 값을 가진 노드를 삭제하는 과정이다. 먼저 탐색 과정과 동일하게 삭제할 노드를 찾는다. 삭제할 노드의 자식 노드 개수에 따라 다음과 같이 처리한다.

  • 자식 노드가 없는 경우 (Leaf Node): 해당 노드를 간단히 삭제한다.
  • 자식 노드가 하나인 경우: 해당 노드를 삭제하고, 자식 노드를 부모 노드에 연결한다.
  • 자식 노드가 두 개인 경우: 해당 노드의 오른쪽 서브트리에서 가장 작은 키 값을 가진 노드(inorder successor)를 찾아 삭제할 노드의 위치로 옮기고, inorder successor를 삭제한다. (inorder successor는 항상 자식 노드가 0개 또는 1개다.)

예시: 키 값 2 삭제

  1. 루트 노드(6)에서 시작하여, 2 < 6 이므로 왼쪽 서브트리로 이동한다.
  2. 현재 노드(2)에서, 2 = 2 이므로 삭제할 노드이다.
  3. 삭제할 노드(2)는 자식 노드를 두 개 가지므로, 오른쪽 서브트리에서 가장 작은 키 값을 가진 노드 [4]를 찾았다.
  4. 노드[4]를 삭제할 노드[2]의 위치로 옮기고, 노드[4]의 원래 위치에서 삭제다.

* Inorder Traversal (중위 순회)

BST의 모든 노드를 정렬된 순서로 방문하는 방법이다. 왼쪽 서브트리, 현재 노드, 오른쪽 서브트리 순으로 방문한다.

Python
def inorder_traversal(node):
    if node is not None:
        inorder_traversal(node.left)
        print(node.key)  # 현재 노드 방문
        inorder_traversal(node.right)

예시: 위에서 삭제 연산 후의 BST에 대해 inorder traversal을 수행하면 1, 4, 6, 8, 9 순으로 출력된다.


BST 성능

Binary Search Tree는 일반적으로 search, insert, delete에서 O(log n)의 시간복잡도를 갖는다. 하지만 서브트리가 편향되는, 위 사진의 경우를 생각해보면 height가 정확히 노드의 수와 일치하므로 O(n)의 시간복잡도를 갖게 된다.

마무리

이진 탐색 트리는 탐색, 삽입, 삭제 연산을 효율적으로 지원하는 강력한 자료구조이다. 정렬된 데이터를 다루거나 효율적인 검색이 필요한 상황에서 유용하게 활용될 수 있다. 하지만 트리의 균형이 깨지면 성능이 저하될 수 있다는 점을 유의해야 한다. 이러한 단점을 보완하기 위해 다양한 종류의 균형 탐색 트리(Balanced Search Tree)가 개발되었으며, 대표적으로 AVL 트리, 레드-블랙 트리 등이 있다. 이에 관하여 다음 포스팅에서 자세히 다뤄보도록 하겠다.

[자료구조] 왜 자료구조를 배우는가?
(https://hyeonb.blogspot.com/2024/03/blog-post.html)
[자료구조] Sorted map & skip list
hyeon_B

안녕하세요! AI 기술을 이용해 더 나은 세상을 만들어 나가고 싶은 과기원생 Hyeon이라고 합니다. 저는 앞으로 인공지능 시대에는 지식을 '활용'하는 능력이 중요해질 것이라고 생각합니다. 대부분의 일들은 인공지능이 뛰어난 모습을 보이지만, 인공지능은 데이터로 부터 연관관계를 학습하기 때문에 지식들을 새로 통합해서 활용하는 능력이 부족합니다. 인공지능이 뉴턴 전에 만들어졌다면 사과가 떨어지는 이유에 대답하지 못했을 것이고, 아인슈타인 전에 만들어졌다면 중력이 어떻게 생기는지 설명하지 못했을 것입니다. 따라서 앞으로 우리는 '본질'을 탐구하고 그 본질로부터 다른 곳에 적용하며 인공지능을 현명하게 활용해야 할 것입니다. 함께 인공지능 시대를 준비합시다!

댓글 쓰기

다음 이전

POST ADS1

POST ADS 2