๐ DFS / BFS
๐ DFS / BFS
๐ DFS ์ BFS
- DFS = Depth Frist Search = ๊น์ด ์ฐ์ ํ์
- BFS = Breadth First Search = ๋๋น ์ฐ์ ํ์
๊ทธ๋ํ๋ ํธ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ฑฐ๋ ์ํํ๋ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐ DFS๋?
- ๊น์ด ์ฐ์ ํ์
- ์๊ฐ ๋ณต์ก๋ : (O(V+E))
- ๊ณต๊ฐ ๋ณต์ก๋ : (O(H)) (H : ํธ๋ฆฌ ๋์ด)
- ํ๋์ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ํ์ํ ๋ค์์ผ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์ด๋
- ๊ตฌํ ๋ฐฉ๋ฒ์ ์คํ, ์ฌ๊ท ํธ์ถ์ ์คํ์ ์๋ฌต์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, DFS๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ท๋ก ๊ตฌํ ๋๊ธฐ๋ ํ๋ค.
๐ DFS ํน์ง
- ํ์ ๋ฐฉ์ : ๋ ธ๋ ๋ฐฉ๋ฌธ > ๋ค์ ๊น์ ๋ ธ๋ ๋ฐฉ๋ฌธ > ๋ ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์ด์ ๋ ธ๋๋ก ๋ฐฑํธ๋ํน
- ๊ตฌํ : ์ฌ๊ท ๋๋ ๋ช ์์ ์ธ ์คํ ์ฌ์ฉ
๐ป DFS ๊ตฌํ
#include <iostream>
#include <vector>
using namespace std;
void dfs(int node, vector<bool>& visited, vector<vector<int>>& graph) {
visited[node] = true; // ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
cout << node << " "; // ๋ฐฉ๋ฌธํ ๋
ธ๋ ์ถ๋ ฅ
for (int neighbor : graph[node]) { // ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ด์ ๋
ธ๋ ํ์
if (!visited[neighbor]) { // ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด ์ฌ๊ท ํธ์ถ
dfs(neighbor, visited, graph);
}
}
}
int main() {
// ๊ทธ๋ํ ์
๋ ฅ (์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์)
vector<vector<int>> graph = {
{}, // 0๋ฒ ๋
ธ๋ (์ฌ์ฉํ์ง ์์)
{2, 3}, // 1๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
{1, 4, 5}, // 2๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
{1}, // 3๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
{2}, // 4๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
{2} // 5๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
};
vector<bool> visited(6, false); // ๋ฐฉ๋ฌธ ์ฌ๋ถ ๋ฐฐ์ด
cout << "DFS Traversal: ";
dfs(1, visited, graph); // 1๋ฒ ๋
ธ๋๋ถํฐ ํ์ ์์
return 0;
}
๐ป ํธ๋ฆฌ์ ์ํ ๋ฐฉ๋ฒ
- ์ ์ ์ํ(Preorder Traversal)
- ํ์ฌ ๋ ธ๋ > ์ผ์ชฝ ์๋ธํธ๋ฆฌ > ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
void preorder(Treenode* node, vector<int>& res) {
if(!node)
{
return;
}
res.push_back(node->val); // ํ์ฌ ๋
ธ๋ ์ฒ๋ฆฌ(์์๋ฅผ ์ถ๋ ฅํ res)
preorder(node->left, res); // ์ผ์ชฝ ์๋ธํธ๋ฆฌ ํ์
preorder(node->right, res); // ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ํ์
}
- ์ค์ ์ํ(Inorder Traversal)
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ > ํ์ฌ ๋ ธ๋ > ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
void inorder(TreeNode* node, vector<int>& res) {
if(!node)
{
return;
}
inorder(node->left, res);
res.push_back(node->val);
inorder(node->right, res);
}
- ํ์ ์ํ(Postorder Traversal)
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ > ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ > ํ์ฌ ๋ ธ๋
void postorder(Treenode* node, vector<int>& res) {
if(!node)
{
return;
}
postorder(node->left, res);
postorder(node->right, res);
res.push_back(node->val);
}
๐ BFS
- ๋๋น ์ฐ์ ํ์
- ์๊ฐ ๋ณต์ก๋ : (O(V+E))
- ๊ณต๊ฐ ๋ณต์ก๋ : (O(V))
- ํ ๋ ธ๋์ ๋ชจ๋ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํ ๋ค, ๊ทธ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ค.
- ๊ตฌํ ๋ฐฉ๋ฒ์ ํ ๋ฅผ ์ฌ์ฉํ๋ค.
๐ BFS ํน์ง
- ํ์ ๋ฐฉ์ : ํ์ฌ ๋ ๋ฒจ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋ ๋ฒจ์ ๋ ธ๋๋ก ๋์ด๊ฐ
- ๊ตฌํ : ๋ช ์์ ์ธ ํ(queue) ์ฌ์ฉ
๐ป BFS ๊ตฌํ
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void bfs(int start, vector<vector<int>>& graph) {
vector<bool> visited(graph.size(), false); // ๋ฐฉ๋ฌธ ์ฌ๋ถ ๋ฐฐ์ด
queue<int> q; // ํ์์ ์ํ ํ
q.push(start); // ์์ ๋
ธ๋๋ฅผ ํ์ ์ถ๊ฐ
visited[start] = true; // ์์ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
while (!q.empty()) {
int node = q.front(); // ํ์ ์ฒซ ๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์ด
q.pop(); // ํ์์ ์ ๊ฑฐ
cout << node << " "; // ๋ฐฉ๋ฌธํ ๋
ธ๋ ์ถ๋ ฅ
for (int neighbor : graph[node]) { // ํ์ฌ ๋
ธ๋์ ๋ชจ๋ ์ธ์ ๋
ธ๋ ํ์
if (!visited[neighbor]) { // ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
q.push(neighbor); // ํ์ ์ถ๊ฐ
visited[neighbor] = true; // ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
}
}
}
}
int main() {
// ๊ทธ๋ํ ์
๋ ฅ (์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์)
vector<vector<int>> graph = {
{}, // 0๋ฒ ๋
ธ๋ (์ฌ์ฉํ์ง ์์)
{2, 3}, // 1๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
{1, 4, 5}, // 2๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
{1}, // 3๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
{2}, // 4๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
{2} // 5๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค
};
cout << "BFS Traversal: ";
bfs(1, graph); // 1๋ฒ ๋
ธ๋๋ถํฐ ํ์ ์์
return 0;
}