OPEN HYPER STEP
← 목록으로 (math)
MATH · 23 / 45
math
CHAPTER 23 / 45
읽기 약 2
FUNCTION

트리: 계층 데이터의 수학


핵심 개념

이진 트리·이진 탐색 트리(BST) — DOM·파일 시스템·JSON의 수학적 구조 + 트리 순회.

본문

트리 = 사이클 없는 연결 그래프

📋 코드 (15줄)
        Root (1)
       /        \
      2          3
     / \        / \
    4   5      6   7
   / \
  8   9

용어:
- Root: 최상위 노드 (1)
- Leaf: 자식 없는 노드 (5, 6, 7, 8, 9)
- Parent/Child: 1은 2와 3의 부모
- Sibling: 같은 부모를 가진 노드 (4와 5)
- Depth: 루트로부터의 거리
- Height: 트리의 최대 깊이

이진 트리 (Binary Tree)

PYTHON📋 코드 (32줄)
# 각 노드가 최대 2개의 자식 (left, right)

class TreeNode:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right


# 예제 트리 만들기
root = TreeNode(1,
    TreeNode(2,
        TreeNode(4),
        TreeNode(5),
    ),
    TreeNode(3,
        TreeNode(6),
        TreeNode(7),
    ),
)


# 시각화
def print_tree(node, depth=0):
    if node is None:
        return
    print_tree(node.right, depth + 1)
    print('   ' * depth + str(node.value))
    print_tree(node.left, depth + 1)


print_tree(root)

트리 순회 4가지

PYTHON📋 코드 (40줄)
# 1. 전위 순회 (Pre-order): 루트 → 왼쪽 → 오른쪽
def preorder(node):
    if node is None:
        return []
    return [node.value] + preorder(node.left) + preorder(node.right)


# 2. 중위 순회 (In-order): 왼쪽 → 루트 → 오른쪽
def inorder(node):
    if node is None:
        return []
    return inorder(node.left) + [node.value] + inorder(node.right)


# 3. 후위 순회 (Post-order): 왼쪽 → 오른쪽 → 루트
def postorder(node):
    if node is None:
        return []
    return postorder(node.left) + postorder(node.right) + [node.value]


# 4. 레벨 순회 (Level-order, BFS)
from collections import deque

def levelorder(root):
    if root is None:
        return []
    result, queue = [], deque([root])
    while queue:
        node = queue.popleft()
        result.append(node.value)
        if node.left: queue.append(node.left)
        if node.right: queue.append(node.right)
    return result


print(preorder(root))    # [1, 2, 4, 5, 3, 6, 7]
print(inorder(root))     # [4, 2, 5, 1, 6, 3, 7]
print(postorder(root))   # [4, 5, 2, 6, 7, 3, 1]
print(levelorder(root))  # [1, 2, 3, 4, 5, 6, 7]

이진 탐색 트리 (BST)

PYTHON📋 코드 (41줄)
# 규칙: 왼쪽 < 부모 < 오른쪽
# → 정렬된 데이터 + O(log n) 탐색

class BST:
    def __init__(self):
        self.root = None

    def insert(self, value):
        self.root = self._insert(self.root, value)

    def _insert(self, node, value):
        if node is None:
            return TreeNode(value)
        if value < node.value:
            node.left = self._insert(node.left, value)
        elif value > node.value:
            node.right = self._insert(node.right, value)
        return node

    def search(self, value):
        return self._search(self.root, value)

    def _search(self, node, value):
        if node is None:
            return False
        if node.value == value:
            return True
        if value < node.value:
            return self._search(node.left, value)
        return self._search(node.right, value)


bst = BST()
for v in [50, 30, 70, 20, 40, 60, 80]:
    bst.insert(v)

print(bst.search(40))  # True
print(bst.search(45))  # False

# 중위 순회 = 정렬된 결과
print(inorder(bst.root))  # [20, 30, 40, 50, 60, 70, 80]

균형의 중요성

📋 코드 (14줄)
✅ 균형 BST           ❌ 불균형 BST
       4               1
      / \               \
     2   6               2
    / \ / \               \
   1  3 5  7              3
                            \
                             4 ...
                              \
                               7

균형: 검색 O(log n)
불균형: 검색 O(n) — 사실상 연결 리스트
→ AVL, Red-Black 트리 등 자동 균형 트리 (모듈 5+)

실전 — DOM 트리

PYTHON📋 코드 (28줄)
# DOM은 트리 — 각 노드가 HTML 요소
dom = {
    'tag': 'html',
    'children': [
        {'tag': 'head', 'children': [
            {'tag': 'title', 'text': 'OHS'},
        ]},
        {'tag': 'body', 'children': [
            {'tag': 'h1', 'text': '제목'},
            {'tag': 'div', 'children': [
                {'tag': 'p', 'text': '본문'},
            ]},
        ]},
    ],
}


# 모든 텍스트 추출 — DFS
def extract_text(node):
    texts = []
    if 'text' in node:
        texts.append(node['text'])
    for child in node.get('children', []):
        texts.extend(extract_text(child))
    return texts


print(extract_text(dom))  # ['OHS', '제목', '본문']

실전 — JSON 파싱

PYTHON📋 코드 (20줄)
# JSON은 트리 — 객체/배열이 노드
import json

data = json.loads('{"a": 1, "b": [2, 3, {"c": 4}]}')

# 모든 정수 값 찾기 — DFS
def find_ints(node):
    ints = []
    if isinstance(node, int):
        ints.append(node)
    elif isinstance(node, dict):
        for v in node.values():
            ints.extend(find_ints(v))
    elif isinstance(node, list):
        for item in node:
            ints.extend(find_ints(item))
    return ints


print(find_ints(data))  # [1, 2, 3, 4]

다음 챕터

CH.24 "해시 함수" — O(1) 검색의 비밀.


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 트리 구조 데이터의 균형 정도와
검색 성능을 분석해서 균형 트리 도입
필요성을 보고해줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

한국 검색 엔진의 자동 완성 트리
구조(트라이/Suffix Tree) 비교를 알려줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 React 컴포넌트 트리를 분석해서
깊이/너비/렌더 비용을 시각화하고
최적화 우선순위를 만들어줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 프론트엔드 가상 DOM(React/Vue/Solid)의
트리 알고리즘 차이를 솔직히 알려줘.

⭐ 이것만 기억하세요
트리: 계층 데이터의 수학 이 3가지만 확실히 잡으세요
1.트리는 사이클 없는 그래프 — DOM·파일 시스템·JSON·React 컴포넌트 모두 트리
2.BST는 정렬된 트리로 O(log n) 검색 — 단 균형 깨지면 O(n)으로 폭락
3.다음 챕터 CH.24에서 해시 함수 — O(1) 검색의 수학적 원리


공유하기
진행도 23 / 45