트리란 이진 트리 순회 BST 활용 📝 문제풀이
◀ 이전 📋 목차 CH 10 ▶
🌳 CHAPTER 09 · 심화

데이터를 가지치기하며 계층으로 담다

배열은 일렬로 늘어놓지만, 트리(Tree)는 위에서 아래로 가지를 뻗으며 계층을 만들어요. 이 구조 덕분에 정렬 유지빠른 검색이 동시에 가능해집니다. 특히 이진 탐색 트리(BST)를 감으로 잡아봐요.

🎯 이 장을 끝내면
📖
트리란
위에서 아래로 가지를 치는 계층 구조
가계도나 폴더 구조를 떠올리면 딱이에요.
🌳 트리 = 뒤집힌 나무 트리(Tree)는 데이터를 계층 구조로 담는 자료구조예요. 맨 위에서 시작해 아래로 가지치기하며 뻗어 나가요. 각 데이터 조각을 노드(node)라 하고, 노드끼리 잇는 선을 간선(edge)이라 불러요. 💡 실제 나무를 거꾸로 뒤집은 모양이에요. 뿌리(루트)가 맨 위에 있고, 잎(리프)이 맨 아래에 있어요.

꼭 알아야 할 기본 용어를 정리해볼게요.

용어
루트(root)맨 위에 있는 시작 노드. 트리에 딱 하나뿐이에요.
부모/자식(parent/child)바로 위 노드가 부모, 바로 아래로 이어진 노드가 자식이에요.
리프(leaf)자식이 없는 끝 노드. 잎사귀에 해당해요.
간선(edge)부모와 자식을 잇는 이에요.
깊이/높이루트에서 얼마나 아래로 내려갔는지를 나타내는 층수예요.
🔤
깊이(depth)와 높이(height) — 둘 다 "층수" 이야기지만 재는 방향이 달라요. 깊이는 루트에서 그 노드까지 몇 칸 내려왔는지예요(루트 자신의 깊이는 0). 높이는 그 노드에서 가장 먼 리프까지 몇 칸 더 내려갈 수 있는지예요. "깊이는 위에서부터, 높이는 아래에서부터 잰다"로 기억하면 헷갈리지 않아요.
🗂️ 도식 — 트리 한눈에 보기
          [ 10 ]        ← 루트(root)
         /      \
      [ 5 ]     [ 15 ]   ← 10의 자식(child)
      /   \        \
  [ 3 ] [ 8 ]     [ 20 ] ← 리프(leaf): 자식 없음
여기서 10은 루트, 5·15는 그 자식이고, 3·8·20은 자식이 없는 리프예요.
🧭
친숙한 예. 가계도(조상 → 후손), 폴더 구조(상위 폴더 → 하위 폴더/파일), 회사 조직도 모두 트리예요. 하나의 꼭대기에서 아래로 갈라지는 구조라면 대부분 트리로 볼 수 있어요.
트리 BST 루트 리프 이진 트리 순회 O(log n) 계층 구조
🖼️ 그림으로 보기 — 이진 탐색 트리(BST)
왼쪽 = 10보다 작음 오른쪽 = 10보다 큼 10 5 15 3 8 20 ← 루트(root) 리프 리프 리프
BST 규칙 = 왼쪽 < 부모 < 오른쪽. 예를 들어 8을 찾으면: 10보다 작으니 왼쪽 → 5보다 크니 오른쪽 → 발견. 매 단계 후보가 절반으로 줄어 균형 잡힌 BST의 검색은 평균 O(log n)이에요.
🔗
이진 트리
자식을 최대 2개까지만
가장 많이 쓰이는 트리의 형태예요.

이진 트리(binary tree)는 각 노드가 자식을 최대 2개(왼쪽·오른쪽)만 갖는 트리예요. 그래서 노드마다 left(왼쪽 자식)와 right(오른쪽 자식)를 가리키죠. 자식이 없으면 리프고요.

🧱 노드 한 개를 코드로
class Node {
  constructor(value) {
    this.value = value;   // 이 노드가 담은 값
    this.left  = null;    // 왼쪽 자식 (없으면 null)
    this.right = null;    // 오른쪽 자식 (없으면 null)
  }
}
노드 하나가 값 + 왼쪽·오른쪽 자식으로 가는 연결을 갖고 있어요. 이 노드들을 이어 붙이면 이진 트리가 돼요. 💡 자식을 최대 2개로 제한하면 구조가 단순해져 다루기 쉽고, 뒤에 나올 이진 탐색 트리의 기반이 돼요.
🚶
순회
트리의 모든 노드를 방문하는 세 가지 방법
순서만 다를 뿐, 결국 전부 들르는 게 목표예요.

순회(traversal)는 트리의 모든 노드를 빠짐없이 방문하는 방법이에요. 배열은 앞에서 뒤로 한 줄이면 끝이지만, 트리는 가지가 갈라지므로 방문 순서를 정해야 해요. 대표적으로 세 가지가 있어요.

🧭 세 가지 순회 — 루트를 언제 방문하느냐의 차이 전위(preorder)루트 → 왼쪽 → 오른쪽. 루트를 먼저 방문해요.
중위(inorder)왼쪽 → 루트 → 오른쪽. 루트를 가운데에 방문해요.
후위(postorder)왼쪽 → 오른쪽 → 루트. 루트를 마지막에 방문해요. 💡 이름의 전·중·후루트를 언제 방문하는지를 뜻해요. 왼쪽을 오른쪽보다 먼저 보는 건 공통이에요.
👀 중위 순회 감 잡기
function inorder(node) {
  if (node === null) return;   // 없으면 되돌아감
  inorder(node.left);          // 1) 왼쪽 먼저
  console.log(node.value);     // 2) 그다음 나(루트)
  inorder(node.right);         // 3) 마지막 오른쪽
}
왼쪽 → 나 → 오른쪽 순서예요. 이 중위 순회가 뒤에 나올 BST와 만나면 아주 특별한 일이 벌어져요. (힌트: 오름차순!)
💡
지금은 순서 감만. 순회는 재귀로 자연스럽게 표현돼요(앞 장에서 다뤘죠). 세부 구현보다 "전위=루트 먼저, 중위=루트 가운데, 후위=루트 마지막"이라는 순서 감각을 챙기면 충분해요.
🔍
BST
이진 탐색 트리 — 규칙 하나로 검색이 빨라진다
왼쪽은 작게, 오른쪽은 크게 정리해두는 거예요.

이진 탐색 트리(BST · Binary Search Tree)규칙 하나를 지키는 이진 트리예요. 어떤 노드를 기준으로 왼쪽 서브트리는 모두 그 노드보다 작고, 오른쪽 서브트리는 모두 큼이에요. 한 줄로 쓰면 왼쪽 < 노드 < 오른쪽이죠.

📐 BST 규칙 — 왼쪽 < 노드 < 오른쪽
          [ 10 ]
         /      \
     (작다)    (크다)
      [ 5 ]     [ 15 ]
      /   \     /    \
   [ 3 ][ 8 ][ 12 ][ 20 ]
   // 10의 왼쪽(5,3,8)은 전부 10보다 작음
   // 10의 오른쪽(15,12,20)은 전부 10보다 큼
모든 노드에서 이 규칙이 성립해요. 예를 들어 15 기준으로도 왼쪽 12는 작고 오른쪽 20은 커요.
⚡ 왜 빠를까 — 절반씩 좁히기 값을 찾을 때, 현재 노드와 비교해서 찾는 값이 작으면 왼쪽, 크면 오른쪽으로만 내려가요. 한 번 비교할 때마다 나머지 절반은 아예 안 봐도 돼요. 그래서 균형이 잘 잡힌 BST에서는 평균 O(log n)으로 검색돼요. (배열을 처음부터 훑는 O(n)보다 훨씬 빨라요.) 💡 이건 앞에서 배운 이진 탐색과 같은 원리예요. BST는 그 절반씩 좁히기를 트리 구조 자체에 새겨 둔 거예요.
🎁
BST + 중위 순회 = 오름차순! BST를 중위 순회(왼 → 루트 → 오)하면 값이 작은 것부터 큰 것 순서(오름차순)로 나와요. 위 그림을 중위로 읽으면 3, 5, 8, 10, 12, 15, 20이에요. 정렬된 결과가 공짜로 나오는 셈이죠.
⚠️
"균형 잡혔을 때"가 조건. 값을 한쪽으로만 넣으면 트리가 일자로 늘어져 사실상 배열처럼 되고, 검색이 O(n)까지 나빠질 수 있어요. 그래서 실무에선 스스로 균형을 맞추는 트리(AVL·레드블랙 트리 등)를 쓰기도 해요.
🛠️
활용
트리는 어디에 쓰일까요
정렬 유지·빠른 검색이 필요한 곳이면 어디든.
쓰임설명
정렬 유지 + 빠른 검색BST는 값을 넣는 동시에 정렬 상태를 유지하면서 평균 O(log n)으로 찾아요.
파일 시스템폴더 안에 폴더, 그 안에 파일 — 전형적인 트리 구조예요.
웹의 DOMHTML 문서도 <html>을 루트로 하는 트리예요(요소 안에 요소).
우선순위·인덱스힙·데이터베이스 인덱스 등도 트리 계열 구조를 활용해요.
🔤
힙(heap) — 가장 작은 값(또는 가장 큰 값)을 늘 맨 위에 두는 특별한 이진 트리예요. "부모는 자식보다 항상 작다"(최소 힙) 같은 규칙만 지키기 때문에, 최솟값·최댓값을 맨 위에서 바로 확인할 수 있어요. 앞서 3장에서 나온 우선순위 큐가 보통 이 힙으로 만들어져요. BST와 달리 전체가 정렬돼 있진 않고, "맨 위가 최소/최대"라는 점만 보장해요.
💡
코테에서는. "정렬을 유지하면서 계속 값을 넣고 빼고 찾아야 한다"거나 "계층/부모-자식 관계를 다뤄야 한다"는 신호가 보이면 트리를 떠올리세요. 순회로 전체를 훑고, BST 규칙으로 절반씩 좁히는 게 핵심 무기예요.
🧪
이 과목의 실습 랩에서 노드를 직접 이어 트리를 만들고 순회·검색을 손으로 짜볼 수 있어요. 상단 🧪 실습 버튼에서 열려요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 손으로 직접 짜보고 싶으면 상단 🧪 실습 랩으로!
CH 10 🎯 코테 실전 기법 — 지금까지의 자료구조·알고리즘을 실전에서 골라 쓰는 법