트리 자료구조 (Tree Data Structure)
트리: 노드(node)로 이루어진 자료구조
- 트리의 루트 노드는 오직 한 개
- 루트는 0개 이상의 자식 노드를 갖고 있음
- 그 자식 노드 또한 0개 이상의 자식 노드를 갖고 있으며 이 정의가 반복됨
트리의 구성 요소
- 노드, 루트 노드, 부모 노드, 자식 노드, 형제 노드, 간선, 잎 노드(단말 노드, 외부 노드), 가지 노드(비 단말 노드, 내부 노드)
노드(node)
- 트리를 구성하고 있는 각각의 요소 → 위 그림에서 P, Q, A, B, L, E, F, G, R, C, D, M, H, I 각각의 요소
루트 노드(root node)
- 최상위 노드 → 위 그림에서는 P
부모 노드(parent node)
- 자식을 가진 노드 → 위 그림에서 P는 Q와 R의 부모 노드, L은 E, F, G의 부모 노드
자식 노드(child node)
- 부모 노드의 하위 노드들 → 위 그림에서 Q와 R은 P의 자식 노드
형제 노드(sibling node)
- 부모가 같은 자식 노드 → 위 그림에서 E, F, G는 부모 노드가 L로 동일함 → E, F, G는 부모가 같은 형제 노드
간선(edge, branch, link)
- 노드를 연결하는 선 → 그림 상 노드와 노드를 연결해주는 직선
잎 노드(leaf node) = 외부 노드(external node) = 단말 노드(terminal node)
- 자식이 더 이상 없는 노드 → 위 그림에서는 B, D, E, F, G, H, I
가지 노드(branch node) = 내부 노드(internal node) = 비 단말 노드(non-terminal node)
- 하나 이상의 자식 노드를 갖는 노드 → 위 그림에서는 P, Q, R, A, C, M, L
추가적으로 알아야 할 기본 용어
- 노드의 크기, 노드의 깊이, 노드의 레벨, 노드의 차수, 트리의 차수, 트리의 레벨
노드의 크기(size)
- 1 (self) + 모든 자손 노드의 수 → 위 그림에서 P는 size가 14(자기 자신 + 13), M은 3(자기 자신 + 2)
- 루트 노드의 경우 전체 노드의 갯수
노드의 깊이(depth)
- 루트에서 어떤 노드에 도달하기 위해 거쳐야 하는 간선의 수 → 0부터 선을 몇번 거쳐가야 하는지 / 그림 참고
노드의 레벨(level)
- 루트에서 어떤 노드까지 간선의 수 → 루트 노드는 level 0, 그 하위 노드는 level1, …, level n까지
노드의 차수(degree)
- 특정 노드의 자식 수 → 맨 위 그림에서 잎 노드의 차수는 0(자식이 없기 때문에), P 노드의 차수는 2(자식이 Q노드, R노드 2개이므로)
트리의 차수(degree of tree)
- 트리의 최대 차수 → 위 그림에서는 최대 차수가 L일 때 3이므로, 트리의 차수는 3이다.
- n차 방정식을 나타낼 때, y=x²+401x+5일 때, 최대 차수를 2로 보는 것과 동일
트리의 높이(height)
- 루트 노드로부터 가장 깊이 있는 노드의 깊이(거쳐야 하는 간선의 수) → 위 그림에서는 5(P→Q→A→L→[E or F or G]
트리의 특징
- 트리는 반드시 1개의 루트 노드와 0개 이상의 하위 노드를 가짐
- 데이터를 순차적으로 저장하지 않으므로 비선형 자료구조
- 트리내에서 또 다른 트리가 있는 재귀적 자료구조
- 간선의 수 = 전체 노드 수 - 1 → 맨 위 그림에서 총 노드 수는 14개이므로 간선의 수는 14-1 = 13이다.
- 노드 간에 부모-자식 관계를 갖고 있는 계층형 자료구조, 모든 자식 노드는 하나의 부모 노드만 가짐
- 노드들끼리는 서로 연결되지 않음 → 서로 연결되면 단순 순환(loop)를 가짐 but 트리는 무방향 그래프 구조
트리가 아닌 경우
1) 루트 노드가 1개가 아닌 경우
위는 루트 노드가 2개(0과 3)가 있으므로 트리가 될 수 없음
2) 노드가 부모-자식 관계가 아닌데 연결된 경우
- 왼쪽의 경우 1↔2, 3↔4가 연결되어 있고, 루트 노드(1, 2)가 2개이므로 트리가 아님
- 오른쪽의 경우 6↔7이 연결되어 있으므로 트리가 아님
트리의 종류
편향 이진트리(Skewed Binary Tree), 이진트리(Binary Tree), 이진 탐색 트리(Binary Search Tree:BST), 포화 이진트리(Full Binary Tree), 완전 이진트리(Complete Binary Tree)
1. 편향 이진트리(경사 트리, Skewed Binary Tree)
- 한 쪽으로만 치우친 트리
2. 이진트리(Binary Tree)
“한 부모 노드에 자식은 2개 이하”
- 각 노드의 차수가 2 이하인 트리
3. 이진 탐색 트리(Binary Search Tree:BST)
“왼쪽 자식 노드는 나보다 작고, 오른쪽 자식 노드는 나보다 크다”
- 이진 탐색을 위한 이진트리(정렬되어 있어야 함)
4. 포화 이진트리(Full Binary Tree) vs 완전 이진트리(Complete Binary Tree)
- 포화 이진트리: 잎 노드를 제외하고 모든 노드들의 차수가 2이며, 잎 노드는 자식을 가지지 않는 트리
- 완전 이진트리: 높이가 h일 때 레벨 1부터 h-1까지는 포화 이진트리이고, 레벨 h에서는 왼쪽부터 노드가 채워져 있는 트리
- 마지막 레벨을 제외한 모든 레벨에서 노드가 가득 차 있음
- 마지막 레벨에서는 노드가 왼쪽부터 순서대로 채워져 있음
→ 포화 이진 트리의 경우에는 모든 레벨에서 노드가 꽉 차 있는 반면, 완전 이진 트리의 경우에는 마지막 레벨을 제외하고 모든 레벨에서 노드가 꽉 차 있고, 마지막 레벨에서는 왼쪽부터 순서대로 채워져 있음
따라서, 포화 이진트리는 항상 완전 이진트리이지만, 모든 완전 이진트리가 포화 이진트리는 아니다.
일반 트리에서 이진트리로 변환(Conversion of a general tree to binary tree)
- 일반 트리는 차수가 불규칙적이기 때문에 자료 처리할 때 비효율적임 → 이럴 해결하기 위해 이진 트리로 변환해야 하는 상황이 생김
Algorithm
Step 1. 각 부모 노드 당 2개의 노드만 갖도록 부모 노드의 왼쪽 자식과 오른쪽 형제 노드를 연결한다.
Step 2. 다음 적절한 각도로 회전시킨다. (일반적으로 45도 회전)
Step 3. 회전한 트리를 적절하게 재배치하면 이진 트리가 됨
'Algorithms & Data Structure' 카테고리의 다른 글
[Algorithms] 셸 정렬(Shell Sort) (0) | 2023.05.04 |
---|---|
[Algorithms] 단순 삽입 정렬(Straight Insertion Sort) (0) | 2023.05.03 |
[Algorithms] 버블 정렬(Bubble Sort) (0) | 2023.05.02 |
[Algorithms] 단순 선택 정렬(Straight Selection Sort) (0) | 2023.05.02 |
[Algorithms] 정렬 알고리즘(Sorting algorithms) (0) | 2023.04.30 |