BFS (Breadth-first-search)는 루트 노드 또는 임의 노드에서 인접한 노드들을 먼저 탐색하는 방법
큐를 통해서 구현한다. (해당 노드의 주변부터 탐색해야하기 때문이다.)
const graph = {
1: [2,3,4],
2: [1,5],
3: [1,6,7],
4: [1,8],
5: [2,9],
6: [3,10],
7: [3],
8: [4],
9: [5],
10: [6],
};
const BFS = (graph, n) => {
const visited = [];
let needVisit = [];
needVisit.push(n);
while(needVisit.length){
const node = needVisit.shift();
if(!visited.includes(node)) {
visited.push(node);
needVisit = [...needVisit, ...graph[node]];
}
}
return visited;
}
BFS(graph, 1);
//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
DFS (Depth-first-Search)는 루트 노드 혹은 임의 노드에서 다음 브렌치로 넘어가기 전에, 해당 브렌치를 모두 탐색하는 방법
스택 or 재귀함수를 통해 구현한다.
const graph = {
1: [2,3,4],
2: [1,5],
3: [1,6,7],
4: [1,8],
5: [2,9],
6: [3,10],
7: [3],
8: [4],
9: [5],
10: [6],
};
const DFS = (graph, n) => {
const visited = [];
let needVisit = [];
needVisit.push(n);
while(needVisit.length){
const node = needVisit.pop();
if(!visited.includes(node)) {
visited.push(node);
// 내림차순 정렬을 해주면 좌측부터 탐색하고 오름차순 정렬을 하면 우측부터 탐색
graph[node].sort((a,b) => b - a);
needVisit = [...needVisit, ...graph[node]];
}
}
return visited;
}
DFS(graph, 1);
// [1, 2, 5, 6, 3, 6, 10, 7, 4, 8]