1. 개념
BFS는 그래프나 트리에서 가장 가까운 노드부터 차례로 탐색해 나가는 알고리즘이다.
주로 큐(Queue) 자료구조를 사용하여 구현하며, 최단 거리 탐색이 필요한 문제에 적합하다.
2. 동작 방식
- 시작 노드를 큐에 삽입하고 방문 표시
- 큐에서 노드를 하나 꺼냄
- 꺼낸 노드의 인접한 노드(또는 자식 노드)를 모두 확인
- 아직 방문하지 않은 노드를 큐에 삽입
- 큐가 빌 때까지 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) (큐와 방문 배열 등으로 인해 정점 수 만큼 공간 필요) |