순서트리의 노드를 스캔하는 방법은 크게 두가지로 BFS와 DFS가 있음
1. BFS
Breadth-First-Search
- 가로검색, 수평검색
- 한 레벨 다음에 다음 레벨로 넘어가는 순서
- 가까운 노드부터 탐색하는 알고리즘
- 큐를 이용 / 구현은 큐 자료구조를 이용
동작방식
1. 탐색 시작 노드를 큐에 삽입하고 방문 처리
2. 큐에서 노드를 꺼내 해당 노드의 인접 노드중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리
3. 2번의 과정을 더이상 수행하지 못할 때까지 반복
시간복잡도
- 탐색을 수행함에 있어 O(N)의 시간이 소요됨
- 실제 수행시간의 경우 DFS보다 좋음
- DFS는 재귀적으로 들어가기 때문에 실제 프로그램 수행시간은 느려질 수 있음
소스코드
# 출처 : 이코테
from collections import deque
# BFS 메서드 정의
def bfs(graph, start, visited):
# 큐 구현을 위해 deque 라이브러리 사용
queue = deque([start])
# 현재 노드를 방문 처리
visited[start] = True
# 큐가 빌 때까지 반복
while queue:
# 큐에서 하나의 원소를 뽑아 출력
v = queue.popleft()
print(v, end=" ")
# 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# 각 노드가 연결된 정보를 리스트 자료형으로 표현 (2차원 리스트)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# 각 노드가 방문된 정보를 리스트 자료형으로 표현 (1차원 리스트)
visited = [False] * 9
# 정의된 BFS 함수 호출
bfs(graph, 1, visited)
2. DFS
Depth-First-Search
- 세로검색, 수평검색, 깊이 우선탐색
- 스택자료구조를 이용, 구현은 재귀함수를 사용
- 가장 깊숙이 위치하는 노드에 닿을 때까지 확인(탐색)하면 됨
동작방식
1. 탐색 시작 노드를 스택에 삽입하고 방문처리
2. 스택의 최상단 노드에 방문하지 않은 인접노드가 있으면 그 인접 노드를 스택에 넣고 방문처리
3. 방문하지 않은 인접노드가 없으면 스택에서 최상단 노드를 꺼냄
4. 2번의 과정을 더 이상 수행할 수 없을 때까지 반복
시간복잡도
- O(N)의 시간이 소요
소스코드
# 출처 : 이코테
# DFS 예제
def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end=" ")
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# 각 노드가 방문된 정보를 리스트 자료형으로 표현 (1차원 리스트)
visited = [False] * 9
# 정의된 DFS 함수 호출
dfs(graph, 1, visited)
3. 전위순회, 중위순회, 후위순회
깊이우선검색의 스캔방법 (3가지)
[출처]
서적 : 이것이 취업을 위한 코딩테스트다
'Review > SW Jungle' 카테고리의 다른 글
[WEEK03] 위상정렬 (0) | 2022.10.13 |
---|---|
[WEEK03] 최단경로 - 다익스트라 / 플로이드워셜 (2) | 2022.10.11 |
[WEEK03] 신장트리와 최소신장트리 (크루스칼 + 프림 알고리즘) (0) | 2022.10.10 |
[WEEK03] 그래프와 트리 (+인접행렬 / 인접리스트 / 이진트리) (0) | 2022.10.10 |
[WEEK03] 힙 / 우선순위 큐 (0) | 2022.10.10 |