এই টিউটোরিয়ালে ডিপথ ফার্স্ট সার্চ (Depth First Search - DFS) ব্যবহার করে বাইনারি ট্রি ট্রাভার্সালের (traversal) প্রতিটি স্টেপ (step) প্রিন্ট করার প্রোগ্রাম আলোচনা করা হবে।
এতে DFS-এ হয়endo সব স্টেপ থাকবে, ব্যাকট্র্যাকিং (backtracking) প্রক্রিয়াও থাকবে।
DFS aikana প্রতিটি নোড ট্রাভার্স করব এবং পেরেন্ট নোড (parent node) ও ব্যবহৃত এজ (edge) সংরক্ষণ করব। ট্রাভার্সালের সময় যদি съসেজ এজ (adjacent edge) ভিজিটেড (visited) থাকে, তবে সেই নোডটিকেই DFS-এ একটি স্টেপ হিসেবে প্রিন্ট করা হবে।
উদাহরণ
#include <bits/stdc++.h> using namespace std; const int N = 1000; vectoradj[N]; // DFS ট্রাভার্সালের স্টেপ প্রিন্ট করা void dfs_steps(int u, int node, bool visited[], vector path_used, int parent, int it){ int c = 0; for (int i = 0; i < node; i++) if (visited[i]) c++; if (c == node) return; // নোডকে ভিজিটেড মার্ক করা visited[u] = true; path_used.push_back({ parent, u }); cout << u << " "; for (int x : adj[u]){ if (!visited[x]) dfs_steps(x, node, visited, path_used, u, it + 1); } for (auto y : path_used) if (y.second == u) dfs_steps(y.first, node, visited, path_used, u, it + 1); } void dfs(int node){ bool visited[node]; vector > path_used; for (int i = 0; i < node; i++) visited[i] = false; dfs_steps(0, node, visited, path_used, -1, 0); } void add_edge(int u, int v){ adj[u].push_back(v); adj[v].push_back(u); } int main(){ int node = 11, edge = 13; add_edge(0, 1); add_edge(0, 2); add_edge(1, 5); add_edge(1, 6); add_edge(2, 4); add_edge(2, 9); add_edge(6, 7); add_edge(6, 8); add_edge(7, 8); add_edge(2, 3); add_edge(3, 9); add_edge(3, 10); add_edge(9, 10); dfs(node); return 0; }
আউটপুট
0 1 5 1 6 7 8 7 6 1 0 2 4 2 9 3 10