트리 순회 (Tree Traversal)

2025-06-26


전위 순회 (Pre-order Traversal)

트리의 전위 순회는 루트 노드를 먼저 방문하고, 왼쪽 서브트리 → 오른쪽 서브트리 순서로 방문하는 순회 방식입니다.

순서: 루트 → 왼쪽 → 오른쪽

        A
       / \
      B   C
     / \   \
    D   E   F

전위 순회 결과: A → B → D → E → C → F

전위 순회 구현 (재귀)

def preorder(node):
    if node is None:
        return
    print(node.val)       # 1. 루트
    preorder(node.left)   # 2. 왼쪽
    preorder(node.right)  # 3. 오른쪽

전위 순회 구현 (반복/스택)

def preorder_iterative(root):
    if not root:
        return []
 
    stack = [root]
    result = []
 
    while stack:
        node = stack.pop()
        result.append(node.val)
 
        # 오른쪽을 먼저 push → 왼쪽이 먼저 pop됨 (전위 순회 순서: 루트 -> 왼쪽 -> 오른쪽 유지)
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)
 
    return result

중위 순회 (In-order Traversal)

중위 순회는 이진 트리 순회 방법 중 하나로, 특히 이진 탐색 트리에서 중요한 역할을 합니다.

순서: 왼쪽 → 루트 → 오른쪽

        4
       / \
      2   6
     / \ / \
    1  3 5  7

중위 순회 결과: 1 → 2 → 3 → 4 → 5 → 6 → 7

이진 탐색 트리(Binary Search Tree)일 경우, 중위 순회를 하면 항상 오름차순 정렬된 값이 됩니다.

이진 탐색 트리는 왼쪽 서브트리는 루트보다 작은 값들, 오른쪽 서브트리는 루트보다 큰 값들, 그래서 중위 순회를 하면 항상 오름차순으로 정렬된 값이 나옵니다.

중위 순회 구현 (반복/스택)

def inorder_iterative(root):
    result = []
    stack = []
    node = root
 
    while node or stack:
        while node:
            stack.append(node)
            node = node.left  # 왼쪽 먼저 탐색
 
        node = stack.pop()
        result.append(node.val)
        node = node.right  # 오른쪽 탐색
 
    return result

후위 순회 (Post-order Traversal)

순서: 왼쪽 → 오른쪽 → 루트

        A
       / \
      B   C
     / \   \
    D   E   F

후위 순회 결과: D → E → B → F → C → A

가장 마지막에 루트 노드를 방문합니다. 하위 트리를 다 처리한 후에 부모 노드를 처리하는 것이 특징입니다.

후위 순회 구현 (재귀)

def postorder(node):
    if not node:
        return
 
    postorder(node.left)     # 1. 왼쪽
    postorder(node.right)    # 2. 오른쪽
    print(node.val)          # 3. 루트

후위 순회 구현 (반복/스택)

def postorder_iterative(root):
    if not root:
        return []
 
    stack = [root]
    result = []
 
    while stack:
        node = stack.pop()
        result.append(node.val)
 
        # 왼쪽 먼저 push (그래야 나중에 pop되므로 오른쪽이 먼저 처리됨)
        if node.left:
            stack.append(node.left)
        if node.right:
            stack.append(node.right)
 
    return result[::-1]  # 결과를 뒤집어야 후위 순서가 됨

레벨 순회 (Level-order Traversal, BFS)

  • 트리의 각 레벨을 위에서 아래로, 왼쪽에서 오른쪽으로 순차적으로 방문합니다.
  • DFS 방식이 아닌 너비 우선 탐색(BFS) 방식으로, 큐(queue)를 사용해 구현합니다.
from collections import deque
 
def level_order(root):
    if not root:
        return []
 
    result = []
    queue = deque([root])
 
    while queue:
        node = queue.popleft()
        result.append(node.val)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
 
    return result

예시 트리

    1
   / \
  2   3
 / \
4   5
  • 순회 결과: [1, 2, 3, 4, 5]

활용 예시

  • 최단 경로 탐색 (BFS 기반)
  • 트리의 깊이 계산
  • 레벨별 노드 그룹화 출력

전위/중위/후위/레벨 순회 비교표

순회 방식방문 순서방식활용 예시
전위 (Pre-order)루트 → 왼쪽 → 오른쪽DFS트리 복사, 표현식 생성
중위 (In-order)왼쪽 → 루트 → 오른쪽DFSBST에서 정렬된 순서 출력
후위 (Post-order)왼쪽 → 오른쪽 → 루트DFS트리 삭제
레벨 순회 (Level-order)상위 레벨부터 좌→우BFS최단 경로 탐색, 트리 깊이 측정