깊은 부분을 우선적으로 탐색하는 알고리즘
출처 : https://developer-mac.tistory.com/64
최대한 깊이 내려간 뒤, 더이상 깊이 갈 곳이 없을 경우 옆으로 이동
스택 자료구조 이용
import java.util.Deque;
import java.util.LinkedList;
public class dfs2 {
public static void main(String[] args) {
int [][]graph = {{},
{2, 3, 8},
{1, 7},
{1, 4, 5},
{3, 5},
{3, 4},
{7},
{2, 6, 8},
{1, 7}};
//각 노드가 방문한 정보를 1차원 배열 자료형으로 표현
boolean[] visited = {false, false, false, false, false, false, false, false, false};
//정의된 DFS함수 호출
dfs2 dfs = new dfs2();
dfs.dfsTest(graph, 1, visited);
}
private void dfsTest(int[][] graph, int start, boolean[] visited) {
//시작노드 방문처리
visited[start] = true;
System.out.print(start + " "); //방문한 노드 출력
Deque<Integer> stack = new LinkedList<>();
stack.push(start); //시작 노드 스택에 입력
while (!stack.isEmpty()) {
int now = stack.peek();
boolean hasNearNode = false;//방문하지 않은 인접 노드가 있는지 확인
//인접 노드를 방문하지 않았을 경우 스택에 넣고 방문처리함
for(int i : graph[now]){
if(!visited[i]){
hasNearNode = true;
stack.push(i);
visited[i] = true;
System.out.print(i + " ");
break;
}
}
if (hasNearNode == false) {
stack.pop();
}
}
}
}
import java.util.Deque;
import java.util.LinkedList;
public class dfs2 {
public static void main(String[] args) {
int [][]graph = {{},
{2, 3, 8},
{1, 7},
{1, 4, 5},
{3, 5},
{3, 4},
{7},
{2, 6, 8},
{1, 7}};
//각 노드가 방문한 정보를 1차원 배열 자료형으로 표현
boolean[] visited = {false, false, false, false, false, false, false, false, false};
//정의된 DFS함수 호출
dfs2 dfs = new dfs2();
dfs.dfsTest(graph, 1, visited);
}
private void dfsTest(int[][] graph, int start, boolean[] visited) {
//시작노드 방문처리
visited[start] = true;
System.out.print(start + " "); //방문한 노드 출력
Deque<Integer> stack = new LinkedList<>();
stack.push(start); //시작 노드 스택에 입력
while (!stack.isEmpty()) {
int now = stack.peek();
boolean hasNearNode = false;//방문하지 않은 인접 노드가 있는지 확인
//인접 노드를 방문하지 않았을 경우 스택에 넣고 방문처리함
for(int i : graph[now]){
if(!visited[i]){
hasNearNode = true;
stack.push(i);
visited[i] = true;
System.out.print(i + " ");
break;
}
}
if (hasNearNode == false) {
stack.pop();
}
}
}
}
가까운 노드부터 탐색하는 알고리즘
출처 : 출처 https://developer-mac.tistory.com/64
최대한 넓게 이동한 다음, 더 이상 갈 수 없을 때 아래로 이동
큐 자료구조 이용
인접한 노드를 반복적으로 큐에 넣도록 알고리즘을 작성
import java.util.LinkedList;
import java.util.Queue;
public class bfs {
public static void main(String[] args) {
//각 노드가 연결된 정보를 2차원 배열로 표현
int[][]graph = {{},
{2, 3, 8},
{1, 7},
{1, 4, 5},
{3, 5},
{3, 4},
{7},
{2, 6, 8},
{1, 7}};
//각 노드가 방문한 정보를 1차원 배열 자료형으로 표현
boolean[] visited = {false, false, false, false, false, false, false, false, false};
int start = 1; //시작노드
Queue<Integer> queue = new LinkedList<>();
queue.add(start);
visited[start] = true;
//큐가 빌때까지 반복
while (!queue.isEmpty()) {
//큐에서 하나의 원소를 뽑아서 출력
int v = queue.poll();
System.out.print(v + " ");
//인접 노드 중 아직 방문하지 않은 원소들을 큐에 삽입
for (int i : graph[v]){
if(visited[i] == false){
queue.add(i);
visited[i] = true;
}
}
}
}
}
출처
https://devuna.tistory.com/32
https://developer-mac.tistory.com/64
https://velog.io/@smallcherry/Java-AlgorithmBFSAndDFS