1. 개념

BFS는 그래프나 트리에서 가장 가까운 노드부터 차례로 탐색해 나가는 알고리즘이다.
주로 큐(Queue) 자료구조를 사용하여 구현하며, 최단 거리 탐색이 필요한 문제에 적합하다.


2. 동작 방식

  1. 시작 노드를 큐에 삽입하고 방문 표시
  2. 큐에서 노드를 하나 꺼냄
  3. 꺼낸 노드의 인접한 노드(또는 자식 노드)를 모두 확인
  4. 아직 방문하지 않은 노드를 큐에 삽입
  5. 큐가 빌 때까지 2~4번 반복

3. 트리 예시로 이해하기

트리 구조 예시

       A
     /   \
    B     C
   / \   / \
  D   E F   G

BFS 탐색 순서

  • 시작 노드: A
  • 방문 순서: A → B → C → D → E → F → G

큐와 방문 순서 변화

단계 큐 상태 방문한 노드

1 [A] []
2 [B, C] [A]
3 [C, D, E] [A, B]
4 [D, E, F, G] [A, B, C]
5 [E, F, G] [A, B, C, D]
6 [F, G] [A, B, C, D, E]
7 [G] [A, B, C, D, E, F]
8 [] [A, B, C, D, E, F, G]

4. 파이썬 코드 예시 (트리 기준)

from collections import deque

class Node:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

def bfs(root):
    if root is None:
        return []

    visited = []
    q = deque([root])

    while q:
        cur_node = q.popleft()
        visited.append(cur_node.value)

        if cur_node.left:
            q.append(cur_node.left)
        if cur_node.right:
            q.append(cur_node.right)

    return visited

nodeD = Node("D")
nodeE = Node("E")
nodeF = Node("F")
nodeG = Node("G")
nodeB = Node("B", left=nodeD, right=nodeE)
nodeC = Node("C", left=nodeF, right=nodeG)
nodeA = Node("A", left=nodeB, right=nodeC)

5. 특징 요약

항목 설명

탐색 순서 가까운 노드부터 레벨 순으로 탐색
자료구조 큐 (Queue)
사용 사례 최단 거리 탐색, 레벨 탐색, 최적 경로 문제 등
시간 복잡도 O(V + E) (V: 정점 수, E: 간선 수)
공간 복잡도 O(V) (큐와 방문 배열 등으로 인해 정점 수 만큼 공간 필요)

 

+ Recent posts