이진 탐색 트리를 배열로 표현하기

  • 46 minutes to read

이진 탐색 트리(Binary Search Tree, BST)는 데이터의 정렬된 상태를 유지하면서 빠른 탐색 속도를 제공하는 효율적인 데이터 구조입니다. 이 글에서는 다양한 프로그래밍 언어를 사용하여 이진 탐색 트리를 배열로 표현하고, 특정 값을 찾는 프로그램을 작성하는 예제를 살펴봅니다.

예제

이진 탐색 트리를 배열로 표현하는 C# 언어 예제

이진 탐색 트리(Binary Search Tree, BST)는 데이터의 정렬된 상태를 유지하면서 빠른 탐색 속도를 제공하는 효율적인 데이터 구조입니다. 이 글에서는 C# 언어를 사용하여 이진 탐색 트리를 배열로 표현하고, 특정 값을 찾는 프로그램을 작성하는 예제를 살펴봅니다.

코드: binary_search_tree_array.cs

  1. Node 클래스 정의
class Node {
    public int PrevNode; // 왼쪽 부분 트리를 가리키는 포인터
    public string Name; // 이름 저장
    public int NextNode; // 오른쪽 부분 트리를 가리키는 포인터
}

Node 클래스는 이진 탐색 트리의 노드를 나타내며, 왼쪽 자식 노드를 가리키는 PrevNode, 이름을 저장하는 Name, 그리고 오른쪽 자식 노드를 가리키는 NextNode를 가지고 있습니다.

  1. 이진 탐색 트리 초기화
Node[] tree = new Node[] {
    new Node { PrevNode = 1, Name = "mm", NextNode = 2 }, // 0
    new Node { PrevNode = 3, Name = "cc", NextNode = 4 }, // 1
    new Node { PrevNode = 5, Name = "rr", NextNode = -1 }, // 2
    new Node { PrevNode = -1, Name = "aa", NextNode = -1 }, // 3
    new Node { PrevNode = 6, Name = "ee", NextNode = 7 }, // 4
    new Node { PrevNode = -1, Name = "nn", NextNode = -1 }, // 5
    new Node { PrevNode = -1, Name = "dd", NextNode = -1 }, // 6
    new Node { PrevNode = -1, Name = "ll", NextNode = -1 } // 7
};

이진 탐색 트리를 배열로 표현하며, 각 노드의 인덱스는 왼쪽과 오른쪽 자식 노드를 가리키는 포인터로 사용됩니다.

  1. 특정 값 찾기
Console.Write("찾을 내용(aa~zz) : ");
string key = Console.ReadLine();
int current = 0;
while (current != -1) {
    if (key == tree[current].Name) {
        Console.WriteLine("찾았습니다.");
        break;
    }
    else if (string.Compare(key, tree[current].Name) < 0) {
        current = tree[current].PrevNode; // 왼쪽 부분 트리로 이동
    }
    else {
        current = tree[current].NextNode; // 오른쪽 부분 트리로 이동
    }
}

사용자로부터 찾고자 하는 값을 입력받아 이진 탐색 트리를 순회하며 값을 찾습니다. 찾고자 하는 값이 현재 노드의 값보다 작으면 왼쪽 자식 노드로 이동하고, 크면 오른쪽 자식 노드로 이동합니다. 이 과정을 반복하여 찾고자 하는 값을 발견하면 "찾았습니다."라는 메시지를 출력합니다. 만약 찾고자 하는 값이 트리에 존재하지 않으면 루프에서 빠져나옵니다.

이 예제에서는 다음과 같은 이진 탐색 트리를 배열로 표현하였습니다.

        mm
       /  \
     cc    rr
    /  \      \
  aa    ee     nn
      /   \
    dd    ll

이진 탐색 트리를 순회하는 동안에는 항상 정렬된 상태를 유지하므로 탐색 시간이 일반적으로 O(log n)입니다. 따라서 이진 탐색 트리는 정렬된 데이터에 대한 빠른 검색을 수행할 수 있는 효율적인 데이터 구조입니다.

이 글에서는 이진 탐색 트리를 배열로 표현하는 C# 언어 예제를 살펴보았습니다. 이 방법을 사용하면 트리에 저장된 데이터를 빠르게 검색할 수 있으며, 구현이 상대적으로 간단하다는 장점이 있습니다. 그러나 배열을 사용하여 이진 탐색 트리를 구현할 때는 배열의 크기를 미리 정해야 한다는 단점도 있습니다. 이를 해결하기 위해 동적으로 메모리를 할당하는 방식을 사용할 수도 있습니다.

마무리

이진 탐색 트리를 배열로 표현하는 예제를 여러 프로그래밍 언어로 살펴보았습니다. 배열을 사용하면 이진 탐색 트리의 노드를 쉽게 관리할 수 있으며, 정렬된 상태를 유지하는 이진 탐색 트리의 특성을 활용하여 빠른 검색이 가능합니다. 각 언어마다 조금씩 다른 구현 방법이 있지만, 이 예제를 통해 이진 탐색 트리의 개념과 구현 방법을 이해할 수 있을 것입니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com