루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#define MAXV 5
using namespace std;
int visit[MAXV] = { 0 };
vector<int> adj[MAXV];
void dfs_recursion(int start) {
if (visit[start]) { //방문한 경우 바로 빠져나옴
return;
}
visit[start] = true; //방문한 노드 표시
printf("%d ", start);
//인접한 노드들 방문
for (int i = 0; i < adj[start].size(); i++) {
int x = adj[start][i];
dfs_recursion(x);
}
}
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <stack>
#define MAXV 5
using namespace std;
int visit[MAXV] = { 0 };
vector<int> adj[MAXV];
void dfs_recursion(int start) {
if (visit[start]) return;
stack<int> s;
s.push(start);
visit[start] = 1;
printf("%d ", start);
while (!s.empty()) {
int here = s.top();
s.pop();
for (int i = 0; i < adj[here].size(); i++) {
int next = adj[here][i];
if (visit[next] == 0) {
printf("%d ", next);
visit[next] = 1;
s.push(here);
s.push(next);
break;
}
}
}
}
int main() {
adj[0].push_back(1);
adj[1].push_back(0);
adj[0].push_back(2);
adj[2].push_back(0);
adj[0].push_back(4);
adj[4].push_back(0);
adj[1].push_back(2);
adj[2].push_back(1);
adj[2].push_back(3);
adj[3].push_back(2);
adj[2].push_back(4);
adj[4].push_back(2);
adj[3].push_back(4);
adj[4].push_back(3);
dfs_recursion(0);
return 0;
}