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

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

마무리

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

더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com