Ch.6 트리 기초
트리란? — 폴더, 가계도, DOM
컴퓨터 안의 모든 것이 트리다
폴더 안에 폴더, 그 안에 파일 — 이 구조를 매일 사용하면서도 이것이 트리라는 사실을 모르는 개발자가 많습니다.
배열과 연결 리스트는 '한 줄'인데, 트리는 왜 '가지'가 필요한가?
계층적 관계를 표현해야 할 때 트리가 유일한 해답입니다. 면접에서도 가장 자주 출제됩니다.
핵심 개념
트리(Tree)
노드와 간선으로 이루어진 계층적 비순환 자료구조
루트(Root)
트리의 최상위 노드. 부모가 없다
리프(Leaf)
자식이 없는 말단 노드
핵심 내용
지금 이 파일을 열기까지 몇 개의 폴더를 거쳤나요?
C:\Users\폴더 구조 — 이것이 트리입니다. 루트 드라이브 아래 폴더(노드)가 가지를 뻗고, 파일(리프)이 끝에 달려 있죠
트리의 핵심 규칙: 사이클이 없다. 어떤 노드에서 출발해도 자기 자신으로 돌아오는 경로가 없습니다
가계도를 떠올려 보세요. 조부모 → 부모 → 자녀 이것도 트리입니다
웹 브라우저도 HTML을 DOM 트리로 파싱합니다. `<html>` 루트 아래 `<head>`와 `<body>`가 자식 노드죠
트리가 쓰이는 곳 • 파일 시스템 — 폴더/파일 계층 • HTML DOM — 웹 페이지 구조 • 조직도 — 상하 관계 • 데이터베이스 인덱스 — B-Tree
배열은 순서, 해시맵은 검색, 트리는 계층. 각 자료구조는 고유한 강점이 있습니다
면접에서 트리 문제를 풀려면 용어를 정확히 알아야 합니다
부모(Parent) — 바로 위 노드 자식(Child) — 바로 아래 노드 형제(Sibling) — 같은 부모의 자식들 깊이(Depth) — 루트에서 해당 노드까지 간선 수 높이(Height) — 해당 노드에서 가장 깊은 리프까지 간선 수 서브트리(Subtree) — 특정 노드를 루트로 하는 부분 트리
이진 트리(Binary Tree)란 각 노드의 자식이 최대 2개인 트리입니다. 면접 트리 문제의 90%가 이진 트리입니다
이진 트리의 노드는 놀라울 정도로 간단합니다
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left # 왼쪽 자식
self.right = right # 오른쪽 자식# 트리 만들기
# 1
# / \
# 2 3
# / \
# 4 5
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print(root.val) # 1 (루트)
print(root.left.val) # 2
print(root.right.val) # 3TreeNode 클래스 하나로 어떤 이진 트리든 만들 수 있습니다. 이 구조를 외워두세요 — 면접 첫 줄에 씁니다
트리의 연산 성능은 높이(h)에 달려있습니다
완전 이진 트리 — 높이 h일 때 노드 수: 2^(h+1) - 1 • 높이 3 → 최대 15개 노드 • 높이 10 → 최대 2,047개 노드 • 높이 20 → 최대 약 200만 개 노드
균형 잡힌 트리에서 탐색은 O(log n). 하지만 한쪽으로 치우치면 O(n)이 됩니다. 이 차이가 면접의 핵심 포인트입니다
이진 트리에서 각 노드가 가질 수 있는 최대 자식 수는?
트리에는 사이클(순환)이 존재할 수 있다
리프(Leaf) 노드란 어떤 노드를 의미하는가?
핵심 용어
트리(Tree)
노드와 간선으로 이루어진 계층적 비순환 자료구조
루트(Root)
최상위 노드 — 부모가 없다
리프(Leaf)
자식이 없는 말단 노드
높이(Height)
루트에서 가장 깊은 리프까지의 간선 수
정리 노트
트리란? — 폴더, 가계도, DOM
핵심 용어
- 트리
- 노드 + 간선, 비순환 계층 구조
- 이진 트리
- 자식 최대 2개인 트리
- 높이
- 루트→가장 깊은 리프까지 간선 수
트리 노드 (Python)
- TreeNode
- val, left, right 세 필드
- 성능
- 균형: O(log n), 편향: O(n)
시각 자료
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작