DFS(Depth-First-Search) : 깊이 우선 탐색
현재 탐색중인 경로를 끝까지 탐색하고 다음 경로로 넘어간다.
root 노드부터 먼저 검색
root노드의 자식 중 가장 왼쪽 노드 부터 탐색
왼쪽 노드의 자식 중 왼쪽….을 탐색하고 다시 부모 노드로 돌아가서 오른쪽 자식 노드 탐색
위 과정을 반복
→ 깊이 우선 탐색은 한 부모노드의 자식을 모두 한번에 검사하는게 아니라 한 가지를 타고 내려가서 가장 멀리있는 노드에 도달하고 나서 다음 다시 부모노드로 돌아와 다른 자식을 탐색한다.
🌟 주로 백트래킹 알고리즘에 사용
root 노드 1 부터 출발해서 다시 1로 돌아오는 경로 찾기
root 노드 1에서 인접한 자식 찾기(방문처리 +스택에 추가)
5 노드를 스택에 추가하고 이어서 6번 노드 방문
6번 노드를 스택에 추가하고 다음 경로가 없기 때문에 6번을 스택에서 제거
다시 5번 노드로 되추적해서 연결된 다른 노드 7번 방문
7번 노드에 연결된 다음 경로가 없기 때문에 7번은 스택에서 제거
5번에 연결된 다른 노드가 없기 때문에 다시 루트노드로 되추적
1번 노드에 연결된 다른 노드 2번으로 이동, 스택에 추가
2번에 연결된 노드….를 반복
최종 경로 : 1→2→3→4→1
void depth_first_tree_search (node v) {
node u;
visit v;
for (each child u of v)//방문중인 노드의 자식 u에 대해
depth_first_tree_search(u);//depth-fisrt-seach 적용
}
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// 그래프의 정점을 표현하는 구조체
struct Node {
int data;
vector<Node*> children;
bool visited; // 방문 여부를 나타내는 변수
// 생성자
Node(int d) : data(d), visited(false) {}
};
// 깊이 우선 탐색 함수
void depth_first_search(Node* start) {
stack<Node*> s;
s.push(start);
while (!s.empty()) {
Node* current = s.top();
s.pop();
// 현재 노드를 방문
if (!current->visited) {
cout << "Visiting node: " << current->data << endl;
current->visited = true;
// 현재 노드의 자식들을 스택에 넣기
for (Node* child : current->children) {
s.push(child);
}
}
}
}
int main() {
// 그래프 생성
Node* node1 = new Node(1);
Node* node2 = new Node(2);
Node* node3 = new Node(3);
Node* node4 = new Node(4);
Node* node5 = new Node(5);
// 그래프의 간선 설정
node1->children.push_back(node2);
node1->children.push_back(node3);
node2->children.push_back(node4);
node2->children.push_back(node5);
// 깊이 우선 탐색 실행
depth_first_search(node1);
return 0;
}