10강 / 20강
트리 — 뿌리에서 뻗어 나가는 가지
계층을 담는 그릇, 그리고 세 가지 순회
지금까지의 자료구조는 전부 한 줄이었습니다. 리스트도, 스택도, 큐도, 연결 리스트도요. 그런데 세상에는 한 줄로 표현할 수 없는 것들이 있습니다.
- 폴더 안에 폴더, 그 안에 또 폴더 📁
- 회사 조직도 — 사장 밑에 부장, 부장 밑에 팀원
- 가계도, 토너먼트 대진표, 웹페이지의 HTML 구조
이런 계층 구조를 담는 그릇이 트리(tree)입니다. 8강의 연결 리스트가 "다음 하나"를 가리켰다면, 트리는 "자식 여럿"을 가리킵니다.
| 용어 | 뜻 |
|---|---|
| 노드(node) | 동그라미 하나. 값이 들어 있는 자리 |
| 루트(root) | 맨 위 노드. 부모가 없는 단 하나 |
| 부모 / 자식 | 바로 위 / 바로 아래로 이어진 노드 |
| 잎(leaf) | 자식이 없는 노드. 가지 끝 |
| 깊이 / 높이 | 루트에서 몇 칸 아래인가 / 트리 전체가 몇 층인가 |
트리를 다루는 코드에는 재귀가 거의 항상 등장합니다.
Python
브라우저에서 실행
이진 트리 — 자식이 최대 둘
자식을 왼쪽·오른쪽 둘까지만 두기로 약속한 트리를 이진 트리(binary tree)라고 합니다. 규칙을 좁히면 다루기가 훨씬 쉬워지고, 11강에서는 여기에 규칙을 하나 더 얹어 엄청나게 빠른 검색을 만들어 냅니다.
재귀 세 줄이면 트리의 높이도 개수도 구해집니다.
Python
브라우저에서 실행
🎮 트리를 만들고 순회해 보세요
트리는 한 줄이 아니라서 "어떤 순서로 다 방문할 것인가"가 문제가 됩니다. 이걸 순회(traversal)라고 하고, 방법이 세 가지 있어요. 아래에서 각각을 눌러 애니메이션으로 확인해 보세요.
세 가지 순회 — 나를 언제 방문하느냐의 차이
왼쪽 가지·나·오른쪽 가지, 이 셋을 어떤 순서로 처리하느냐만 다릅니다.
| 이름 | 순서 | 쓰이는 곳 |
|---|---|---|
| 전위 (preorder) | 나 → 왼 → 오 | 트리 복사, 폴더 구조 출력 |
| 중위 (inorder) | 왼 → 나 → 오 | 이진탐색트리를 정렬된 순서로 (11강) |
| 후위 (postorder) | 왼 → 오 → 나 | 폴더 용량 계산, 트리 삭제 |
| 레벨 (BFS) | 위층부터 한 층씩 | 가까운 것부터 찾기 (15강) |
세 줄짜리 순회 세 개. print 위치만 다릅니다.
Python
브라우저에서 실행
계산기와 컴파일러가 수식을 이해하는 방식입니다.
Python
브라우저에서 실행
🤔 확인 문제
트리에서 루트(root)는?
해설 루트는 부모가 없는 단 하나의 노드입니다. 자식이 없는 노드는 잎(leaf)이에요.
🤔 확인 문제
트리를 다루는 코드에 재귀가 자주 나오는 이유는?
해설 "트리 = 루트 + 트리들" 이라는 정의가 재귀적입니다. 그래서 "왼쪽 가지를 처리하고, 오른쪽 가지를 처리하고"라고 쓰면 자연스럽게 재귀가 돼요.
🤔 확인 문제
레벨 순회(위층부터 한 층씩)를 구현할 때 필요한 자료구조는?
해설 먼저 만난 노드의 자식을 먼저 봐야 하므로 FIFO = 큐입니다. 재귀(=스택)로 하면 깊이 먼저 내려가 버려요. 이 차이가 15강 BFS vs DFS의 핵심입니다.