티스토리 뷰
반응형
트리(Tree) 자료구조 쉽게 이해하기: 이진트리부터 탐색까지 한 번에 정리
자료구조를 조금 더 깊이 공부하면 반드시 만나게 되는 것이 바로 **트리(Tree)**입니다. 트리는 계층적 구조를 표현할 수 있는 비선형 자료구조로, 디렉토리 구조, 조직도, 게임 AI, 컴파일러 등 수많은 실무 영역에서 쓰입니다.
이번 글에서는 트리의 기본 개념부터 이진트리, 이진탐색트리(BST), 순회(Traversal) 방식까지 정리하고, 실제 코드로 어떻게 구현되는지도 자세히 알아보겠습니다.
🌳 트리(Tree)란?
트리는 **계층 구조(Hierarchical Structure)**를 표현하기 위한 비선형 자료구조입니다.
노드(Node)들과 노드 간의 관계(간선, Edge)로 구성되며, 루트(Root)부터 리프(Leaf)까지 이어집니다.
✅ 기본 용어 정리
용어 설명
루트 노드(Root) | 트리의 시작점 (최상단 노드) |
부모 노드(Parent) | 다른 노드를 가리키는 노드 |
자식 노드(Child) | 부모로부터 연결된 하위 노드 |
리프 노드(Leaf) | 자식이 없는 노드 |
서브트리(Subtree) | 특정 노드를 루트로 하는 하위 트리 |
깊이(Depth) | 루트에서 특정 노드까지의 거리 |
높이(Height) | 리프까지의 최대 거리 |
✅ 이진트리(Binary Tree)
이진트리는 모든 노드가 최대 두 개의 자식 노드를 가지는 트리입니다.
🔹 이진트리 구조
1
/ \
2 3
/ \ \
4 5 6
📌 파이썬 구현 예시
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
# 이진트리 구성
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
🔍 트리 순회(Traversal) 방식
반응형
트리는 선형 구조가 아니기 때문에 **노드를 방문하는 방식(순회)**이 중요합니다.
가장 대표적인 세 가지 순회 방식은 다음과 같습니다:
1. 중위 순회 (In-order): 왼쪽 → 루트 → 오른쪽
def inorder(node):
if node:
inorder(node.left)
print(node.data, end=' ')
inorder(node.right)
inorder(root) # 출력: 4 2 5 1 3 6
2. 전위 순회 (Pre-order): 루트 → 왼쪽 → 오른쪽
def preorder(node):
if node:
print(node.data, end=' ')
preorder(node.left)
preorder(node.right)
preorder(root) # 출력: 1 2 4 5 3 6
3. 후위 순회 (Post-order): 왼쪽 → 오른쪽 → 루트
def postorder(node):
if node:
postorder(node.left)
postorder(node.right)
print(node.data, end=' ')
postorder(root) # 출력: 4 5 2 6 3 1
✅ 이진 탐색 트리(Binary Search Tree, BST)
BST는 왼쪽 자식 < 루트 < 오른쪽 자식 규칙을 따르는 이진트리입니다.
탐색, 삽입, 삭제 연산이 평균적으로 **O(log n)**의 성능을 갖습니다.
📌 삽입 함수 구현 예시
def insert(node, data):
if node is None:
return Node(data)
if data < node.data:
node.left = insert(node.left, data)
else:
node.right = insert(node.right, data)
return node
# BST 생성
bst_root = Node(10)
insert(bst_root, 5)
insert(bst_root, 15)
insert(bst_root, 3)
insert(bst_root, 7)
📌 탐색 함수 구현
def search(node, target):
if node is None:
return False
if node.data == target:
return True
elif target < node.data:
return search(node.left, target)
else:
return search(node.right, target)
print(search(bst_root, 7)) # True
print(search(bst_root, 20)) # False
📊 트리 vs 배열/리스트 성능 비교
연산 배열/리스트 이진 탐색 트리
검색 | O(n) | O(log n) |
삽입 | O(1) or O(n) | O(log n) |
삭제 | O(n) | O(log n) |
정렬 | 필요 | 자동 정렬 유지 |
🌐 트리 자료구조가 사용되는 곳
- 디렉토리 구조, 파일 시스템
- DOM 구조 (웹 개발)
- 게임 AI (Minimax 트리)
- 파싱 트리 (컴파일러)
- 힙 정렬(Heap Sort), 우선순위 큐(Priority Queue)
📌 결론 및 요약
- 트리는 계층적 구조를 표현하는 자료구조로, 다양한 분야에서 필수적으로 사용됩니다.
- 이진트리는 가장 기본적인 트리 형태이며, 순회 방식에 따라 다양한 알고리즘 문제에 활용됩니다.
- 이진 탐색 트리는 빠른 탐색과 삽입/삭제가 가능한 효율적인 트리입니다.
- 실전에서는 BST 외에도 AVL 트리, 힙, B-트리 등 다양한 변형이 존재합니다.
👉 다음 글에서는 이진 탐색(Binary Search)와 정렬 알고리즘을 결합한 실전 예제를 다루겠습니다!
📚 참고자료 및 출처
- 『Introduction to Algorithms (CLRS)』
- GeeksforGeeks – Tree Data Structure
- 『파이썬으로 배우는 자료구조』
'Programming > 알고리즘' 카테고리의 다른 글
정렬 알고리즘 총정리: 버블, 선택, 삽입부터 퀵, 병합까지 비교와 구현 (1) | 2025.04.07 |
---|---|
이진 탐색(Binary Search) 완전 정복: 원리, 구현, 실전 문제까지 (0) | 2025.04.04 |
스택(Stack)과 큐(Queue)의 구조, 차이점, 실전 활용법 완전 정리 (1) | 2025.04.01 |
배열 vs 연결리스트 완전 비교: 자료구조 선택 기준과 실제 예제 코드 (1) | 2025.04.01 |
빅오(Big-O) 표기법 완전 정복: 시간복잡도와 공간복잡도 분석하는 법 (1) | 2025.04.01 |
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 웹개발
- 프론트엔드면접
- Ktor
- 프론트엔드
- AI챗봇
- fastapi
- SEO최적화
- Python
- App Router
- 백엔드개발
- Docker
- REACT
- NestJS
- flax
- nodejs
- 파이썬알고리즘
- Next.js
- llm
- kotlin
- CI/CD
- 딥러닝
- PostgreSQL
- seo 최적화 10개
- nextJS
- Prisma
- 개발블로그
- gatsbyjs
- JAX
- rag
- SEO 최적화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함
반응형