트리 이론

From CS Wiki

트리 이론(Tree Theory)은 그래프 이론의 하위 분야로, 트리(Tree)라는 특정한 유형의 그래프를 연구하는 학문이다. 트리는 사이클이 없는 연결 그래프이며, 데이터 구조 및 알고리즘에서 중요한 역할을 한다. 트리 이론은 네트워크, 데이터베이스, 검색 알고리즘, 파일 시스템 등의 다양한 응용 분야에서 활용된다.

1 정의[edit | edit source]

트리는 사이클이 없는 연결 그래프로, 다음과 같은 성질을 만족한다.

  • 노드(V)와 간선(E) 사이의 관계 → V개의 노드를 가지는 트리는 항상 V-1개의 간선을 가진다.
  • 유일한 경로 → 두 노드 간의 경로가 항상 유일해야 한다.
  • 사이클이 없음 → 어떤 노드에서 출발해 방향을 따라가도 다시 같은 노드로 돌아오는 경로(순환, Cycle)가 존재하지 않는다.

2 트리의 종류[edit | edit source]

트리는 다양한 유형으로 분류된다.

2.1 루트 트리(Rooted Tree)[edit | edit source]

특정한 노드를 루트(Root)로 지정한 트리. 예: 이진 트리, AVL 트리, B-트리

2.2 이진 트리(Binary Tree)[edit | edit source]

각 노드가 최대 두 개의 자식 노드를 가질 수 있는 트리.

  • 이진 탐색 트리(BST) → 왼쪽 서브트리는 작은 값, 오른쪽 서브트리는 큰 값을 가짐
  • 균형 트리(Balanced Tree) → AVL 트리, 레드-블랙 트리(RB Tree) 등

2.3 스패닝 트리(Spanning Tree)[edit | edit source]

주어진 그래프에서 최소한의 간선만 포함하여 모든 노드를 연결하는 트리.

  • 최소 신장 트리(MST, Minimum Spanning Tree) → 크루스칼 알고리즘, 프림 알고리즘으로 찾을 수 있음

2.4 K-진 트리(K-ary Tree)[edit | edit source]

각 노드가 최대 K개의 자식을 가질 수 있는 트리. 예: 3진 트리(Ternary Tree), 4진 트리(Quaternary Tree)

3 트리의 표현 방법[edit | edit source]

트리는 여러 방식으로 표현할 수 있다.

3.1 부모 배열(Parent Array)[edit | edit source]

각 노드의 부모를 배열로 나타냄.

노드:   0  1  2  3  4  5  
부모:  -1  0  0  1  1  2  

0번 노드는 루트(-1), 1번과 2번은 0번의 자식.

3.2 인접 리스트(Adjacency List)[edit | edit source]

각 노드마다 자식 노드 목록을 저장.

0: [1, 2]  
1: [3, 4]  
2: [5]  
3: []  
4: []  
5: []  

4 트리 알고리즘[edit | edit source]

트리에서는 다양한 알고리즘이 사용된다.

4.1 트리 순회(Tree Traversal)[edit | edit source]

트리의 모든 노드를 특정한 순서로 방문하는 알고리즘.

  • 전위 순회(Preorder) → 루트 → 왼쪽 → 오른쪽
  • 중위 순회(Inorder) → 왼쪽 → 루트 → 오른쪽
  • 후위 순회(Postorder) → 왼쪽 → 오른쪽 → 루트
  • 레벨 순회(Level Order) → BFS 방식

4.2 트리 검색(Tree Search)[edit | edit source]

  • 이진 탐색 트리(BST)에서 특정 값 찾기 (O(log N))
  • 트라이(Trie) → 문자열 탐색에 사용

4.3 최소 신장 트리(MST, Minimum Spanning Tree)[edit | edit source]

  • 크루스칼 알고리즘 (O(E log E))
  • 프림 알고리즘 (O((V+E) log V))

5 코드 예제[edit | edit source]

아래는 이진 트리의 순회 예제이다.

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def inorder_traversal(node):
    if node:
        inorder_traversal(node.left)
        print(node.value, end=" ")
        inorder_traversal(node.right)

# 트리 생성
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)

# 중위 순회 실행
inorder_traversal(root)
출력 결과 예시:
 4 2 5 1 3  

6 응용[edit | edit source]

트리는 다양한 분야에서 활용된다.

  • 컴퓨터 과학 → 데이터 구조 (BST, AVL, B-트리)
  • 파일 시스템 → 디렉토리 구조
  • 네트워크 → 라우팅 트리
  • 인공지능 → 의사결정 트리(Decision Tree)
  • 문자열 탐색 → 트라이(Trie) 사용

7 같이 보기[edit | edit source]

8 참고 문헌[edit | edit source]

  • Cormen, Thomas H., et al. "Introduction to Algorithms." MIT Press, 2009.
  • Knuth, Donald E. "The Art of Computer Programming, Volume 1: Fundamental Algorithms." Addison-Wesley, 1997.