트리 (Tree)

한눈에 보기

노드를 부모 자식 관계로 연결한 계층적 자료구조인 트리를 다룬다. 기본 용어, 이진 트리의 종류, 네 가지 순회 방식, 높이와 균형이 성능을 좌우하는 이유까지 정리했다.

최종 업데이트 2026.09.17

트리(Tree)는 노드(node)들을 부모와 자식의 관계로 연결한 계층적 자료구조로, 사이클(cycle)이 없는 연결 그래프다. 트리는 하나의 루트(root)에서 시작해 아래로 가지를 뻗는 구조 덕분에 파일 시스템, 조직도, HTML의 문서 객체 모델(DOM, Document Object Model)처럼 계층 관계를 가진 데이터를 자연스럽게 표현한다. 탐색 트리, 힙(Heap), 트라이(Trie), B 트리(B-Tree) 등 수많은 파생 구조의 뿌리가 되는 개념이다.

기본 용어

트리를 다루려면 용어부터 정확해야 한다. 루트는 부모가 없는 최상위 노드이고, 자식이 없는 노드는 리프(leaf)라고 한다. 간선(edge)은 노드 사이의 연결이며, 노드가 n개인 트리의 간선은 항상 n에서 1을 뺀 개수다. 어떤 노드의 깊이(depth)는 루트에서 그 노드까지의 간선 수이고, 높이(height)는 그 노드에서 가장 먼 리프까지의 간선 수다. 트리의 높이는 루트의 높이와 같다. 형제(sibling)는 같은 부모를 공유하는 노드들이고, 부분 트리(subtree)는 어떤 노드와 그 자손 전체가 이루는 트리다.

트리의 형식적 정의도 알아두면 좋다. 트리는 사이클이 없고 모든 노드가 연결된 그래프이며, 임의의 두 노드 사이 경로가 정확히 하나만 존재한다. 이 성질 때문에 트리에서는 같은 노드를 두 번 방문할 걱정 없이 재귀적으로 문제를 쪼갤 수 있다.

이진 트리와 그 변형

자식을 최대 두 개까지만 갖는 트리를 이진 트리(binary tree)라고 하며, 알고리즘에서 가장 널리 다루는 형태다. 형태에 따라 몇 가지 이름이 붙는다.

종류정의특징
정 이진 트리(full binary tree)모든 노드의 자식이 0개 또는 2개자식이 하나뿐인 노드가 없다
완전 이진 트리(complete binary tree)마지막 레벨을 제외하고 가득 차 있고 마지막 레벨은 왼쪽부터 채워짐배열로 빈틈없이 표현할 수 있어 힙의 기반이 된다
포화 이진 트리(perfect binary tree)모든 레벨이 완전히 가득 참높이 h일 때 노드 수가 2^(h+1) - 1개
편향 트리(skewed tree)모든 노드가 한쪽 자식만 가짐사실상 연결 리스트로 퇴화한 형태

완전 이진 트리는 배열 표현이 특히 유용하다. 루트를 인덱스 0에 두면 i번 노드의 자식은 2i+1과 2i+2, 부모는 (i-1)/2로 계산되어 포인터 없이도 트리를 다룰 수 있다.

순회 방식

트리의 모든 노드를 방문하는 것을 순회(traversal)라고 하며, 방문 순서에 따라 네 가지가 기본이다. 전위 순회(preorder)는 자신, 왼쪽, 오른쪽 순서로 방문하며 트리 복사나 직렬화에 쓰인다. 중위 순회(inorder)는 왼쪽, 자신, 오른쪽 순서이며 이진 탐색 트리(Binary Search Tree)에 적용하면 오름차순 정렬 결과를 얻는다. 후위 순회(postorder)는 왼쪽, 오른쪽, 자신 순서로, 자식을 먼저 정리해야 하는 삭제나 디렉터리 용량 계산에 적합하다. 레벨 순회(level order)는 큐(Queue)를 이용해 같은 깊이의 노드를 차례로 방문하는 너비 우선 탐색(BFS)이다. 앞의 세 방식은 재귀나 스택으로 구현하는 깊이 우선 탐색(DFS)에 해당하며, 모두 O(n)에 끝난다.

코드 예시

다음은 이진 트리의 중위 순회와 높이 계산을 재귀로 구현한 자바(Java) 예시다. 트리 문제 대부분이 이런 재귀 구조로 환원된다.

class Node {
    int value;
    Node left, right;
}

void inorder(Node node) {
    if (node == null) return;
    inorder(node.left);
    System.out.println(node.value);
    inorder(node.right);
}

int height(Node node) {
    if (node == null) return -1; // 리프의 높이를 0으로 두는 관례
    return 1 + Math.max(height(node.left), height(node.right));
}

균형의 중요성과 파생 구조

트리 연산의 비용은 대부분 높이에 비례한다. 노드 n개짜리 이진 트리의 높이는 균형이 잡혀 있으면 O(log n)이지만, 편향되면 O(n)까지 늘어난다. 그래서 탐색 성능을 보장하려면 AVL 트리나 레드 블랙 트리(Red-Black Tree) 같은 자가 균형(self-balancing) 트리가 필요하고, 디스크 기반 저장소에서는 한 노드에 키를 여러 개 담아 높이를 극단적으로 낮춘 B 트리 계열이 쓰인다. 문자열 검색에는 트라이, 우선순위 관리에는 힙이 있다. 결국 트리를 이해한다는 것은 "높이를 어떻게 관리하느냐"라는 관점으로 파생 구조들을 꿰는 일이다.

면접에서 이렇게 물어본다

  • 트리가 그래프와 구별되는 조건을 말하고, 노드 n개인 트리의 간선 수가 항상 n-1개인 이유를 설명해 보라.
  • 완전 이진 트리와 포화 이진 트리의 차이를 설명하고, 완전 이진 트리를 배열로 표현하는 방법을 말해 보라.
  • 전위, 중위, 후위 순회의 방문 순서를 설명하고 각각이 유용한 사례를 들어 보라.
  • 트리의 높이가 성능에 미치는 영향과, 균형을 유지하는 트리가 필요한 이유를 설명해 보라.
  • 재귀 없이 중위 순회를 구현하려면 어떤 자료구조가 필요한지 설명해 보라.
자료구조 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기