C# 코딩테스트 강좌, 트리 순회하기

현대 소프트웨어 개발에서 알고리즘과 자료구조는 핵심적인 역할을 합니다. 특히, 트리는 많은 문제에서 중요한 자료구조로 활용됩니다. 본 포스트에서는 트리의 기본 개념과 함께 트리 순회를 활용한 알고리즘 문제를 살펴보겠습니다. C#을 사용하여 트리 순회 문제를 해결하는 방법에 대해 자세히 설명할 것이며, 문제를 해결하기 위한 단계별 과정을 제공합니다.

1. 트리의 기초

트리는 비선형 데이터 구조로, 각 노드가 부모 노드와 자식 노드들로 이루어진 계층적 구조를 가지고 있습니다. 트리의 주요 특징은 다음과 같습니다.

  • 루트 노드(ROOT): 트리의 최상위 노드입니다.
  • 리프 노드(LEAF): 자식이 없는 노드를 가리킵니다.
  • 서브트리(SUBTREE): 특정 노드를 루트로 하는 전부 혹은 일부 노드 집합을 의미합니다.
  • 높이(HEIGHT): 루트 노드에서 가장 깊은 리프 노드까지의 거리입니다.

2. 트리 순회 알고리즘

트리 순회는 트리의 노드를 특정한 순서로 방문하는 과정을 말합니다. 일반적으로 사용되는 순회 방식은 다음과 같습니다.

  • 전위 순회(Pre-order Traversal): 현재 노드 -> 왼쪽 서브트리 -> 오른쪽 서브트리
  • 중위 순회(In-order Traversal): 왼쪽 서브트리 -> 현재 노드 -> 오른쪽 서브트리
  • 후위 순회(Post-order Traversal): 왼쪽 서브트리 -> 오른쪽 서브트리 -> 현재 노드
  • 레벨 순회(Level-order Traversal): 각 노드의 깊이별로 순차적으로 방문

3. 문제 설명

이제 간단한 트리 순회문제를 해결해 보겠습니다.

문제: 이진트리의 전위 순회 결과를 반환하는 함수를 작성하시오. 입력은 이진트리의 루트 노드를 의미합니다.

4. 이진트리 노드 클래스 정의

C#에서 이진트리의 노드를 정의하기 위해, 아래와 같은 클래스를 작성합니다.

            
public class TreeNode {
    public int Value { get; set; }
    public TreeNode Left { get; set; }
    public TreeNode Right { get; set; }

    public TreeNode(int value) {
        Value = value;
        Left = null;
        Right = null;
    }
}
            
        

5. 전위 순회 구현

전위 순회는 재귀적으로 구현할 수 있습니다. 아래에 전위 순회를 위한 메서드를 작성해 보겠습니다.

            
public IList PreOrderTraversal(TreeNode root) {
    List result = new List();
    PreOrderHelper(root, result);
    return result;
}

private void PreOrderHelper(TreeNode node, List result) {
    if (node == null) return;
    result.Add(node.Value);
    PreOrderHelper(node.Left, result);
    PreOrderHelper(node.Right, result);
}
            
        

6. 알고리즘 분석

전위 순회 알고리즘의 시간 복잡도는 O(n)입니다. 이는 트리의 모든 노드를 한 번씩 방문하므로 전체 노드 수에 비례합니다. 공간 복잡도는 트리의 깊이에 따라 달라지며, 최악의 경우 완전한 이진트리에서 O(h) (여기서 h는 트리의 높이)가 됩니다.

7. 예제와 테스트

위의 알고리즘을 테스트하기 위해 예시 트리를 생성하고 전위 순회를 실행해 보겠습니다.

            
public static void Main(string[] args) {
    TreeNode root = new TreeNode(1);
    root.Left = new TreeNode(2);
    root.Right = new TreeNode(3);
    root.Left.Left = new TreeNode(4);
    root.Left.Right = new TreeNode(5);

    IList result = PreOrderTraversal(root);
    Console.WriteLine(string.Join(", ", result)); // 출력: 1, 2, 4, 5, 3
}
            
        

8. 결론

본 포스트에서는 C#을 사용하여 이진트리의 전위 순회 알고리즘을 구현해보았습니다. 트리 구조는 다양한 분야에서广泛하게 사용되므로, 이러한 순회 알고리즘에 대한 이해는 필수적입니다. 또한 트리에서 다양한 문제를 해결할 수 있는 다양한 알고리즘을 배우는 것이 개발자로서의 역량을 키우는 데 큰 도움이 될 것입니다.

더 많은 알고리즘 문제를 해결하고 싶다면, 다른 순회 알고리즘 및 트리와 관련된 문제들을 연습해보세요. 이를 통해 트리에 대한 전반적인 이해를 높일 수 있습니다.

작성자: 조광형

날짜: 2024년 11월 26일