BFS(Breath-First-Search) : 너비 우선 탐색
같은 자식 레벨은 다 탐색하고 다음 레벨의 자식으로 넘어간다.
- root 노드부터 먼저 검색
- level 1의 모든 노드 검색(왼쪽 노드부터 오른쪽 노드로)
- level 2…leaf마디 까지 모든 노드 검색
사용 : 그래프(최단 거리 구하기), 트리(트리를 레벨별로 탐색) 자료구조 탐색에 사용
🌟 노드를 방문 하는 순서 : 1→2→3→…→10
void breadth_first_search(tree T) {
queue_of_node Q;
node u, v;
initialize(Q); // 큐 Q가 비도록 초기화
v = root of T;//루트 노드 v
visit v;//v 방문
enqueue(Q,v);//v를 큐에 추가
while(!empty(Q)) {//큐에 들어온 노드가 있다면
dequeue(Q,v);//해당 노드를 큐에서 제거하고
for(each child u of v) {//v의 자식들 u에 대해
visit u;//u 방문
enqueue(Q,u);//큐에 추가
}
}
}
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 그래프의 정점을 표현하는 구조체
struct Node {
int data;
vector<Node*> neighbors;
bool visited; // 방문 여부를 나타내는 변수
};
// 너비우선 탐색 함수
void breadth_first_search(Node* start) {
queue<Node*> q;
// 시작 정점을 큐에 넣고 방문 처리
q.push(start);
start->visited = true;
while (!q.empty()) {
// 큐에서 정점을 하나씩 꺼냄
Node* current = q.front();
q.pop();
// 현재 정점 방문
cout << "Visiting node: " << current->data << endl;
// 현재 정점의 모든 인접한 정점들에 대해
for (Node* neighbor : current->neighbors) {
// 인접한 정점이 방문되지 않았다면 큐에 넣고 방문 처리
if (!neighbor->visited) {
q.push(neighbor);
neighbor->visited = true;
}
}
}
}
int main() {
// 그래프 생성
Node* node1 = new Node{1, {}, false};
Node* node2 = new Node{2, {}, false};
Node* node3 = new Node{3, {}, false};
Node* node4 = new Node{4, {}, false};
// 그래프의 간선 설정
node1->neighbors.push_back(node2);
node1->neighbors.push_back(node3);
node2->neighbors.push_back(node4);
node3->neighbors.push_back(node4);
// 너비우선 탐색 실행
breadth_first_search(node1);
return 0;
}