10강 / 20강

트리 — 뿌리에서 뻗어 나가는 가지

계층을 담는 그릇, 그리고 세 가지 순회

트리 — 뿌리에서 뻗어 나가는 가지
트리는 거꾸로 선 나무입니다. 뿌리가 위, 잎이 아래.

지금까지의 자료구조는 전부 한 줄이었습니다. 리스트도, 스택도, 큐도, 연결 리스트도요. 그런데 세상에는 한 줄로 표현할 수 없는 것들이 있습니다.

  • 폴더 안에 폴더, 그 안에 또 폴더 📁
  • 회사 조직도 — 사장 밑에 부장, 부장 밑에 팀원
  • 가계도, 토너먼트 대진표, 웹페이지의 HTML 구조

이런 계층 구조를 담는 그릇이 트리(tree)입니다. 8강의 연결 리스트가 "다음 하나"를 가리켰다면, 트리는 "자식 여럿"을 가리킵니다.

용어뜻
노드(node)동그라미 하나. 값이 들어 있는 자리
루트(root)맨 위 노드. 부모가 없는 단 하나
부모 / 자식바로 위 / 바로 아래로 이어진 노드
잎(leaf)자식이 없는 노드. 가지 끝
깊이 / 높이루트에서 몇 칸 아래인가 / 트리 전체가 몇 층인가
트리를 다루는 코드에는 재귀가 거의 항상 등장합니다.
Python 브라우저에서 실행

이진 트리 — 자식이 최대 둘

자식을 왼쪽·오른쪽 둘까지만 두기로 약속한 트리를 이진 트리(binary tree)라고 합니다. 규칙을 좁히면 다루기가 훨씬 쉬워지고, 11강에서는 여기에 규칙을 하나 더 얹어 엄청나게 빠른 검색을 만들어 냅니다.

재귀 세 줄이면 트리의 높이도 개수도 구해집니다.
Python 브라우저에서 실행

🎮 트리를 만들고 순회해 보세요

트리는 한 줄이 아니라서 "어떤 순서로 다 방문할 것인가"가 문제가 됩니다. 이걸 순회(traversal)라고 하고, 방법이 세 가지 있어요. 아래에서 각각을 눌러 애니메이션으로 확인해 보세요.

트리 순회 — 전위·중위·후위·레벨 순서를 애니메이션으로
불러오는 중…

세 가지 순회 — 나를 언제 방문하느냐의 차이

왼쪽 가지·나·오른쪽 가지, 이 셋을 어떤 순서로 처리하느냐만 다릅니다.

이름순서쓰이는 곳
전위 (preorder)나 → 왼 → 오트리 복사, 폴더 구조 출력
중위 (inorder)왼 → 나 → 오이진탐색트리를 정렬된 순서로 (11강)
후위 (postorder)왼 → 오 → 나폴더 용량 계산, 트리 삭제
레벨 (BFS)위층부터 한 층씩가까운 것부터 찾기 (15강)
세 줄짜리 순회 세 개. print 위치만 다릅니다.
Python 브라우저에서 실행
계산기와 컴파일러가 수식을 이해하는 방식입니다.
Python 브라우저에서 실행
🤔 확인 문제
트리에서 루트(root)는?
🤔 확인 문제
트리를 다루는 코드에 재귀가 자주 나오는 이유는?
🤔 확인 문제
레벨 순회(위층부터 한 층씩)를 구현할 때 필요한 자료구조는?