아래의 그래프를
딕셔너리로 구현하면 다음과 같다.
graph = {
1 : [2, 3, 4],
2 : [5],
3 : [5],
4 : [],
5 : [6, 7],
6 : [],
7 : []
}
1.스택과 while pop구문으로 구현하는 DFS
return -> [1, 4, 3, 5, 7, 6, 2]
def DFS(graph, start_node):
# 1개의 dict와 2개의 list
need_visit, visited = list(), list()
# 초기화
need_visit.append(start_node)
# while pop에서는 need_visit리스트의 원소들을 삭제하는 구조를 취한다.
#스택을 활용해서 쉽게 DFS를 구현할 수 있지만
#이 방식은 순회의 방향이 오른쪽 노드를 우선으로 탐색하게 된다.
while need_visit:
node = need_visit.pop()
#그래프의 그림을 보며 따라가보면 쉽게 이해할 수 있다.
if node not in visited:
visited.append(node)
need_visited.extend(graph[node])
return visited
2-1. 재귀함수의 특징과 그 특징을 이용한 알고리즘의 구상
2-2. 재귀함수로 구현한 DFS
return -> [1, 2, 5, 6, 7, 3, 4]
def recursive_dfs(node, visited = []):
visited.append(node)
for visiting_node in graph[node]:
if visiting_node not in visited:
recursive_dfs(visiting_node, visited)
return visited