In iterative depth first traversal of graph problem, we have given a graph data structure. Write the program to print the depth first traversal of the given graph using the iterative method.
Table of Contents
Example
Input : 0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, 2 -> 3, 3 -> 3
Output : 1 2 0 3
Input : 2 -> 0, 0 -> 2, 1 -> 2, 0 -> 1, 3 -> 3, 1 -> 3
Output : 2 0 1 3
Algorithm for Iterative Depth First Traversal of Graph
- Create a class Graph. Initialize an integer variable to store the vertices and a list of the integer type.
- Create the parameterized constructor of the class which accepts an integer value of the vertex as it’s a parameter. Store the value passed as a parameter in the vertex variable of the class and create a list in the list of the class.
- Similarly, create the function to add the edge which accepts a vertex and an edge ending value as it’s a parameter. Push the value of edge in the list of the given vertex.
- Finally, create the function for depth-first traversal which accepts an integer say s representing the source node as it’s a parameter. Initialize a vector of boolean type and set all the values of the vector as false.
- Create a stack data structure and store the value of the source node in it.
- Traverse while the stack is not empty. Update the value of the source node as the element at the top of the stack and pop it from the stack.
- If the value in the vector at the index s i.e. source node is false, print the source node and update the value in the vector at the index s as true.
- Traverse through the list of vertex/node s and check if the value at the current index in the vector is false to push it in the stack.
C++ Program for Iterative Depth First Traversal of Graph
#include<bits/stdc++.h> using namespace std; class Graph{ int V; list<int> *adj; public: Graph(int V); void addEdge(int v, int w); void DFS(int s); }; Graph::Graph(int V){ this->V = V; adj = new list<int>[V]; } void Graph::addEdge(int v, int w){ adj[v].push_back(w); } void Graph::DFS(int s){ vector<bool> visited(V, false); stack<int> stack; stack.push(s); while (!stack.empty()){ s = stack.top(); stack.pop(); if(!visited[s]){ cout << s << " "; visited[s] = true; } for(auto i = adj[s].begin(); i != adj[s].end(); ++i){ if(!visited[*i]){ stack.push(*i); } } } } int main(){ Graph g(5); g.addEdge(1, 0); g.addEdge(0, 2); g.addEdge(2, 1); g.addEdge(0, 3); g.addEdge(1, 4); g.DFS(0); return 0; }
0 3 2 1 4
Java Program for Iterative Depth First Traversal of Graph
import java.util.*; class IterativeTraversal{ static class Graph{ int V; LinkedList<Integer>[] adj; Graph(int V){ this.V = V; adj = new LinkedList[V]; for(int i = 0; i < adj.length; i++){ adj[i] = new LinkedList<Integer>(); } } void addEdge(int v, int w){ adj[v].add(w); } void DFS(int s){ Vector<Boolean> visited = new Vector<Boolean>(V); for(int i = 0; i < V; i++){ visited.add(false); } Stack<Integer> stack = new Stack<>(); stack.push(s); while(stack.empty() == false){ s = stack.peek(); stack.pop(); if(visited.get(s) == false){ System.out.print(s + " "); visited.set(s, true); } Iterator<Integer> itr = adj[s].iterator(); while (itr.hasNext()){ int v = itr.next(); if(!visited.get(v)){ stack.push(v); } } } } } public static void main(String[] args){ Graph g = new Graph(5); g.addEdge(1, 0); g.addEdge(0, 2); g.addEdge(2, 1); g.addEdge(0, 3); g.addEdge(1, 4); g.DFS(0); } }
0 3 2 1 4
Complexity Analysis
Time Complexity: O(V+E) where V and E are the numbers of vertices and edges respectively of the given graph.
Space Complexity: O(V) because we used space for V nodes/elements.