트리(Tree)의 기본 개념과 예시
트리(Tree)는 계층적인 관계를 표현하는 데이터 구조이다. 트리는 노드(Node)와 간선(Edge)으로 이루어지며, 데이터 구조나 알고리즘에서 중요한 역할을 한다.
- 노드(Node):
- 트리의 기본 구성 요소이다. 각 노드는 데이터를 포함하고, 다른 노드들과 연결될 수 있다. 노드의 개수는 트리의 크기를 나타낸다.
- 루트 노드(Root Node):
- 트리의 최상단에 위치한 노드이다. 부모 노드가 없는 유일한 노드로, 모든 노드는 루트 노드로부터 시작되는 경로를 가진다.
- 부모 노드(Parent Node):
- 자식 노드를 직접 연결하는 상위 노드이다. 부모 노드는 자식 노드의 상위에 위치하며, 두 노드를 연결하는 간선으로 표시된다.
- 자식 노드(Child Node):
- 특정 노드에 의해 연결된 하위 노드이다. 부모 노드와 자식 노드는 간선으로 연결된다.
- 형제 노드(Sibling Node):
- 동일한 부모를 공유하는 노드이다. 형제 노드들은 같은 부모 노드로부터 연결된 여러 자식 노드들이다.
- 잎 노드(Leaf Node):
- 자식 노드가 없는 말단 노드이다. 트리의 끝을 의미하며, 더 이상 하위 노드로 확장되지 않는 노드이다.
- 간선(Edge):
- 두 노드를 연결하는 선이다. 간선은 부모와 자식 노드를 이어주며, 트리의 구조를 형성한다.
트리의 종류와 예시
- 이진 트리(Binary Tree):
- 각 노드가 최대 두 개의 자식을 가지는 트리이다. 왼쪽 자식과 오른쪽 자식으로 구분된다.
- 예시:
A / \ B C / \ \ D E F
- A는 루트 노드이고, B와 C는 A의 자식 노드이다.
- D, E, F는 각각 B와 C의 자식 노드로, 각 노드가 최대 두 개의 자식을 가진다.
- 완전 이진 트리(Complete Binary Tree):
- 마지막 레벨을 제외한 모든 레벨이 꽉 차 있으며, 마지막 레벨의 노드들은 가능한 한 왼쪽부터 차례대로 배치된 트리이다.
- 예시:
A / \ B C / \ / D E F
- 마지막 레벨의 노드들이 가능한 왼쪽에 배치되어 있으며, 이진 트리의 모든 레벨이 가득 차 있다.
- 포화 이진 트리(Full Binary Tree):
- 모든 노드가 0개 또는 2개의 자식 노드를 가지는 트리이다.
- 예시:
A / \ B C / \ / \ D E F G
- 모든 노드가 자식 노드를 2개씩 가지거나(내부 노드), 자식 노드가 없는(잎 노드) 트리이다.
- 균형 이진 트리(Balanced Binary Tree):
- 트리의 모든 잎 노드가 루트에서 동일한 거리 내에 있는 트리이다.
- 예시:
A / \ B C / \ / \ D E F G
- 모든 잎 노드(D, E, F, G)가 루트 노드(A)로부터 동일한 거리에 있다.
- 이진 탐색 트리(Binary Search Tree):
- 왼쪽 자식 노드에는 부모 노드보다 작은 값이, 오른쪽 자식 노드에는 부모 노드보다 큰 값이 위치하는 트리이다.
- 예시:
10 / \ 5 15 / \ / \ 3 7 12 18
- 모든 노드의 왼쪽 서브트리에는 부모 노드보다 작은 값이, 오른쪽 서브트리에는 큰 값이 위치한다.
- N-진 트리(N-ary Tree):
- 각 노드가 최대 N개의 자식을 가질 수 있는 트리이다.
- 예시:
A / | \ B C D /| |\ E F G H
- A는 3개의 자식을 가지고 있으며, B, C, D는 각각 2개의 자식을 가진다. 이 트리는 3진 트리(N=3)이다.
- 트라이(Trie):
- 문자열을 저장하는 데 최적화된 트리 구조이다. 각 노드는 하나의 문자를 나타내며, 여러 문자열을 같은 트리 내에서 관리할 수 있다.
- 예시:
"" / \ t b / / \ o a e / \ \ p y t / s
- 이 트리는 "top", "toy", "bat", "be"와 같은 단어들을 저장한다. 각 경로는 하나의 단어를 나타낸다.
트리의 주요 연산
- 탐색(Search):
- 트리에서 특정 값을 찾는 작업이다.
- 이진 탐색 트리에서는 일반적으로 O(log n)의 시간 복잡도를 가진다.
- 삽입(Insertion):
- 트리에 새로운 노드를 추가하는 작업이다.
- 특정 위치(대개 리프 노드)에서 새로운 노드를 추가한다.
- 삭제(Deletion):
- 트리에서 특정 노드를 제거하는 작업 이다.
- 노드를 삭제한 후, 트리의 구조를 유지하기 위해 재조정이 필요할 수 있다.
- 순회(Traversal):
- 트리의 모든 노드를 방문하는 과정.
- 주로 세 가지 방법이 존재 :
- 전위 순회(Pre-order Traversal): 루트 -> 왼쪽 -> 오른쪽
- 중위 순회(In-order Traversal): 왼쪽 -> 루트 -> 오른쪽
- 후위 순회(Post-order Traversal): 왼쪽 -> 오른쪽 -> 루트
트리의 활용 예
- 파일 시스템: 디렉토리 구조는 트리 구조로 표현된다.
- 컴퓨터 그래픽스: 장면 그래프(Scene Graph)나 뷰 계층(View Hierarchy) 등에서 트리를 사용한다.
- 네트워크 라우팅: 라우팅 테이블은 트리 구조로 되어 있으며, 빠른 탐색을 가능하게 한다.
- 데이터베이스 인덱스: B-트리와 같은 트리 구조는 데이터베이스에서 인덱스를 유지하는 데 사용 된다.
- 인공지능: 의사결정 트리(Decision Tree)와 같은 기법은 트리 구조를 이용해 결정을 내린다.
트리는 이러한 다양한 특성과 구조 덕분에 컴퓨터 과학의 많은 분야에서 중요한 역할을 한다.
'Algorithm' 카테고리의 다른 글
[크래프톤 정글 ] 스택과 큐 (0) | 2024.09.20 |
---|---|
[크래프톤정글] 파이썬의 메모리 관리 (0) | 2024.09.20 |
[크래프톤 정글 week01] 리스트 와 문자열 (0) | 2024.09.20 |
[크래프톤 정글] 백준 9663번 N_queen 문제 (1) | 2024.09.17 |
[크래프톤 정글] 백준 1914번 하노이의 탑 (2) | 2024.09.15 |