//순회를 시작 할 시작점 노드를 인수를 받는다.
depthFirstRecursive(vertex){ //재귀형
var results = [];//결과를 저장
var visited = {};//방문을 추적할 객체
const list = this.List;
function DFS(vertex){
if(!vertex) return null;
visited[vertex] = true;
results.push(vertex);
//방문한 정점의 간선들이 연결된 정점을 순회하여 아직 방문하지 않은 노드들로 헬퍼 함수를 재귀한다.
list[vertex].forEach((v)=>{
if(!visited[v]){
return DFS(v);
}
});
}
DFS(vertex);
return results;
}
const g = new Graph();
g.addVertex("A");
g.addVertex("B");
g.addVertex("C");
g.addVertex("D");
g.addVertex("E");
g.addVertex("F");
g.addEdge("A", "B");
g.addEdge("A", "C");
g.addEdge("B", "D");
g.addEdge("C", "E");
g.addEdge("D", "E");
g.addEdge("D", "F");
g.addEdge("E", "F");
// A
// / \
// B C
// | |
// D --- E
// \ /
// F
// A부터 순회를 시작하도록 depthFirstRecursive('A') 메소드를 실행하면, 마지막 줄과 같이 예상한대로 순회했음을 확인할 수 있다.
console.log(g.depthFirstRecursive("A"));
// [ 'A', 'B', 'D', 'E', 'C', 'F' ]
depthFirstIterative(start){
var stack = [start]; //재귀형의 호출스택 대신 스택 사용
var results = []; //결과
var visited = {}; // 방문 추적 객체
var curVertex;
visited[start] = true;
while(stack.length){
curVertex = stack.pop();
results.push(curVertex);
this.List[curVertex].forEach((v)=>{
if(!visited[v]){
visited[v] = true;
stack.push(v);
}
})
}
return results;
}
const g = new Graph();
g.addVertex("A");
g.addVertex("B");
g.addVertex("C");
g.addVertex("D");
g.addVertex("E");
g.addVertex("F");
g.addEdge("A", "B");
g.addEdge("A", "C");
g.addEdge("B", "D");
g.addEdge("C", "E");
g.addEdge("D", "E");
g.addEdge("D", "F");
g.addEdge("E", "F");
// A
// / \
// B C
// | |
// D --- E
// \ /
// F
// 위와 같은 그래프에서 A부터 순회를 시작하도록 depthFirstIterative('A') 메서드를 실행하면, 마지막 줄과 같이 순회했음을 확인할 수 있다.
console.log(g.depthFirstIterative("A"));
// [ 'A', 'C', 'E', 'F', 'D', 'B' ]
-BFS(너비우선탐색)은 현재 같은 레벨의 형제
정점들을 먼저 방문하는 알고리즘이다.
breadthFirst(start){ //너비우선
var result = [];
var visited = {};
var queue = [start]; //스택 대신 큐 사용
var currentVertex;
visited[start] = true;
while(queue.length){
//stack 대신 queue를 사용하였다.
currentVertex = queue.shift();
result.push(currentVertex);
this.List[currentVertex].forEach((v)=>{
if(!visited[v]){
visited[v] = true;
queue.push(v);
}
});
}
return result;
}
const g = new Graph();
g.addVertex("A");
g.addVertex("B");
g.addVertex("C");
g.addVertex("D");
g.addVertex("E");
g.addVertex("F");
g.addEdge("A", "B");
g.addEdge("A", "C");
g.addEdge("B", "D");
g.addEdge("C", "E");
g.addEdge("D", "E");
g.addEdge("D", "F");
g.addEdge("E", "F");
// A
// / \
// B C
// | |
// D --- E
// \ /
// F
console.log(g.breadthFirst("A"));
// RESULT: [A, B, C, D, E, F]