루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
넓게(wide) 탐색하기 전에 깊게(deep) 탐색하는 방법이다
모든 노드를 방문 하고자 하는 경우에 이 방법을 선택한다.
깊이 우선 탐색(DFS)이 너비 우선 탐색(BFS)보다 좀 더 간단하다.
단순 검색 속도 자체는 너비 우선 탐색(BFS)에 비해서 느리다.
# 리스트를 활용한 DFS 구현
def dfs(graph, start_node):
# 아직 방문하지 않은 노드의 리스트와 이미 방문한 노드의 리스트 2개를 생성하는 것이 기본이다.
need_visit, visited = list(), list()
need_visit.append(start_node)
while need_visit:
# 스택 구조를 활용
node = need_visit.pop()
if node not in visited:
visited.append(node)
need_visit.extend(graph[node])
return visited
# 재귀함수를 이용한 DFS 구현
def recursive_dfs(graph, start, visited = [])
visited.append(start)
for node in graph[start]:
if node not in visited:
recursive_dfs(graph, node, visited)
return visited