
1. 트리 정렬이란?
트리 정렬(Tree Sort)은 이진 탐색 트리(Binary Search Tree, BST)를 기반으로 한 정렬 알고리즘입니다. 데이터를 BST에 삽입한 후, 중위 순회(Inorder Traversal)를 수행하여 정렬된 데이터를 얻는 방식으로 동작합니다.
이 정렬 방식은 평균적으로 O(n log n)의 시간 복잡도를 가지며, 안정적인 정렬을 보장합니다.
2. 트리 정렬 동작 원리
트리 정렬은 다음과 같은 방식으로 동작합니다:
- 데이터를 하나씩 이진 탐색 트리에 삽입합니다.
- 중위 순회(Inorder Traversal)를 수행하여 정렬된 데이터를 출력합니다.
예제: 트리 정렬 과정 (오름차순 정렬)
다음과 같은 배열이 있다고 가정하겠습니다.
[5, 3, 8, 4, 2]
트리 정렬이 진행되는 과정은 다음과 같습니다.
- BST에 데이터를 삽입
5
/ \
3 8
/ \
2 4
- 중위 순회(Inorder Traversal) 수행 → [2, 3, 4, 5, 8]
3. 트리 정렬 구현
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
left = right = null;
}
}
class TreeSort {
private TreeNode root;
public void insert(int val) {
root = insertRec(root, val);
}
private TreeNode insertRec(TreeNode root, int val) {
if (root == null) {
return new TreeNode(val);
}
if (val < root.val) {
root.left = insertRec(root.left, val);
} else {
root.right = insertRec(root.right, val);
}
return root;
}
public void inorderTraversal(TreeNode root) {
if (root != null) {
inorderTraversal(root.left);
System.out.print(root.val + " ");
inorderTraversal(root.right);
}
}
public void treeSort(int[] arr) {
for (int num : arr) {
insert(num);
}
inorderTraversal(root);
}
public static void main(String[] args) {
int[] arr = {5, 3, 8, 4, 2};
TreeSort treeSort = new TreeSort();
treeSort.treeSort(arr);
// 출력: 2 3 4 5 8
}
}
4. 트리 정렬의 시간 복잡도
경우 | 시간 복잡도 |
최선의 경우 | O(n log n) |
평균의 경우 | O(n log n) |
최악의 경우 | O(n²) (편향 트리 발생 시) |
- 균형이 잡힌 BST에서는 O(n log n)의 성능을 보장합니다.
- **편향된 트리(Skewed Tree)**가 발생하면 O(n²)까지 성능이 저하될 수 있습니다.
5. 트리 정렬의 장점과 단점
✅ 장점
- 안정적인 정렬 (Stable Sort)
- 추가적인 메모리가 필요 없음 (In-place 정렬 가능)
- 트리를 활용하여 검색, 삽입, 삭제 연산도 가능
❌ 단점
- BST가 균형을 이루지 않으면 성능 저하(O(n²))
- 추가적인 트리 구조가 필요하여 구현이 복잡
6. 트리 정렬이 적합한 경우
- 데이터의 중복이 적고, 무작위로 분포된 경우
- 정렬과 동시에 데이터 검색이 필요한 경우
- 삽입과 삭제가 빈번하게 발생하는 경우

트리 정렬은 이진 탐색 트리를 활용하여 데이터를 정렬하는 방식으로, 검색과 정렬을 동시에 수행할 수 있는 강력한 알고리즘입니다. 하지만 트리가 균형을 이루지 못하면 성능이 저하될 수 있으므로, AVL 트리나 Red-Black 트리와 같은 균형 잡힌 트리와 함께 사용하는 것이 일반적입니다.
'Algorithm' 카테고리의 다른 글
백준 1260번: 카드 정렬하기 (0) | 2025.03.06 |
---|---|
백준 1931번: 회의실 배정 (1) | 2025.02.24 |
퀵 정렬(Quick Sort) (0) | 2025.02.19 |
힙 정렬(Heap Sort) (0) | 2025.02.19 |
병합 정렬(Merge Sort) (0) | 2025.02.19 |