Depth First Traversal (or Search) for a graph is similar to Depth First Traversal of a tree. The only catch here is, unlike trees, graphs may contain cycles, a node may be visited twice. To avoid processing a node more than once, use a boolean visited array.
Example:
Input: n = 4, e = 6
0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, 2 -> 3, 3 -> 3
Output: DFS from vertex 1 : 1 2 0 3
Explanation:
DFS Diagram:
Input: n = 4, e = 6
2 -> 0, 0 -> 2, 1 -> 2, 0 -> 1, 3 -> 3, 1 -> 3
Output: DFS from vertex 2 : 2 0 1 3
Explanation:
DFS Diagram:
![]()
Prerequisites: See this post for all applications of Depth First Traversal.
Following are implementations of simple Depth First Traversal. The C++ implementation uses adjacency list representation of graphs. STL‘s list container is used to store lists of adjacent nodes.
Solution:
- Approach: Depth-first search is an algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible along each branch before backtracking. So the basic idea is to start from the root or any arbitrary node and mark the node and move to the adjacent unmarked node and continue this loop until there is no unmarked adjacent node. Then backtrack and check for other unmarked nodes and traverse them. Finally print the nodes in the path.
- Algorithm:
- Create a recursive function that takes the index of node and a visited array.
- Mark the current node as visited and print the node.
- Traverse all the adjacent and unmarked nodes and call the recursive function with index of adjacent node.
-
Implementation:
C++
// C++ program to print DFS traversal from// a given vertex in a given graph#include<bits/stdc++.h>usingnamespacestd;// Graph class represents a directed graph// using adjacency list representationclassGraph{intV;// No. of vertices// Pointer to an array containing// adjacency listslist<int> *adj;// A recursive function used by DFSvoidDFSUtil(intv,boolvisited[]);public:Graph(intV);// Constructor// function to add an edge to graphvoidaddEdge(intv,intw);// DFS traversal of the vertices// reachable from vvoidDFS(intv);};Graph::Graph(intV){this->V = V;adj =newlist<int>[V];}voidGraph::addEdge(intv,intw){adj[v].push_back(w);// Add w to v’s list.}voidGraph::DFSUtil(intv,boolvisited[]){// Mark the current node as visited and// print itvisited[v] =true;cout << v <<" ";// Recur for all the vertices adjacent// to this vertexlist<int>::iterator i;for(i = adj[v].begin(); i != adj[v].end(); ++i)if(!visited[*i])DFSUtil(*i, visited);}// DFS traversal of the vertices reachable from v.// It uses recursive DFSUtil()voidGraph::DFS(intv){// Mark all the vertices as not visitedbool*visited =newbool[V];for(inti = 0; i < V; i++)visited[i] =false;// Call the recursive helper function// to print DFS traversalDFSUtil(v, visited);}// Driver codeintmain(){// Create a graph given in the above diagramGraph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);cout <<"Following is Depth First Traversal"" (starting from vertex 2) \n";g.DFS(2);return0;}chevron_rightfilter_noneJava
// Java program to print DFS traversal from a given given graphimportjava.io.*;importjava.util.*;// This class represents a directed graph using adjacency list// representationclassGraph{privateintV;// No. of vertices// Array of lists for Adjacency List RepresentationprivateLinkedList<Integer> adj[];// ConstructorGraph(intv){V = v;adj =newLinkedList[v];for(inti=0; i<v; ++i)adj[i] =newLinkedList();}//Function to add an edge into the graphvoidaddEdge(intv,intw){adj[v].add(w);// Add w to v's list.}// A function used by DFSvoidDFSUtil(intv,booleanvisited[]){// Mark the current node as visited and print itvisited[v] =true;System.out.print(v+" ");// Recur for all the vertices adjacent to this vertexIterator<Integer> i = adj[v].listIterator();while(i.hasNext()){intn = i.next();if(!visited[n])DFSUtil(n, visited);}}// The function to do DFS traversal. It uses recursive DFSUtil()voidDFS(intv){// Mark all the vertices as not visited(set as// false by default in java)booleanvisited[] =newboolean[V];// Call the recursive helper function to print DFS traversalDFSUtil(v, visited);}publicstaticvoidmain(String args[]){Graph g =newGraph(4);g.addEdge(0,1);g.addEdge(0,2);g.addEdge(1,2);g.addEdge(2,0);g.addEdge(2,3);g.addEdge(3,3);System.out.println("Following is Depth First Traversal "+"(starting from vertex 2)");g.DFS(2);}}// This code is contributed by Aakash Hasijachevron_rightfilter_nonePython3
# Python3 program to print DFS traversal# from a given given graphfromcollectionsimportdefaultdict# This class represents a directed graph using# adjacency list representationclassGraph:# Constructordef__init__(self):# default dictionary to store graphself.graph=defaultdict(list)# function to add an edge to graphdefaddEdge(self, u, v):self.graph[u].append(v)# A function used by DFSdefDFSUtil(self, v, visited):# Mark the current node as visited# and print itvisited[v]=Trueprint(v, end=' ')# Recur for all the vertices# adjacent to this vertexforiinself.graph[v]:ifvisited[i]==False:self.DFSUtil(i, visited)# The function to do DFS traversal. It uses# recursive DFSUtil()defDFS(self, v):# Mark all the vertices as not visitedvisited=[False]*(max(self.graph)+1)# Call the recursive helper function# to print DFS traversalself.DFSUtil(v, visited)# Driver code# Create a graph given# in the above diagramg=Graph()g.addEdge(0,1)g.addEdge(0,2)g.addEdge(1,2)g.addEdge(2,0)g.addEdge(2,3)g.addEdge(3,3)print("Following is DFS from (starting from vertex 2)")g.DFS(2)# This code is contributed by Neelam Yadavchevron_rightfilter_noneC#
// C# program to print DFS traversal// from a given graphusingSystem;usingSystem.Collections.Generic;// This class represents a directed graph// using adjacency list representationclassGraph{privateintV;// No. of vertices// Array of lists for// Adjacency List RepresentationprivateList<int>[] adj;// ConstructorGraph(intv){V = v;adj =newList<int>[v];for(inti = 0; i < v; ++i)adj[i] =newList<int>();}//Function to Add an edge into the graphvoidAddEdge(intv,intw){adj[v].Add(w);// Add w to v's list.}// A function used by DFSvoidDFSUtil(intv,bool[] visited){// Mark the current node as visited// and print itvisited[v] =true;Console.Write(v +" ");// Recur for all the vertices// adjacent to this vertexList<int> vList = adj[v];foreach(varninvList){if(!visited[n])DFSUtil(n, visited);}}// The function to do DFS traversal.// It uses recursive DFSUtil()voidDFS(intv){// Mark all the vertices as not visited// (set as false by default in c#)bool[] visited =newbool[V];// Call the recursive helper function// to print DFS traversalDFSUtil(v, visited);}// Driver CodepublicstaticvoidMain(String[] args){Graph g =newGraph(4);g.AddEdge(0, 1);g.AddEdge(0, 2);g.AddEdge(1, 2);g.AddEdge(2, 0);g.AddEdge(2, 3);g.AddEdge(3, 3);Console.WriteLine("Following is Depth First Traversal "+"(starting from vertex 2)");g.DFS(2);Console.ReadKey();}}// This code is contributed by techno2mahichevron_rightfilter_none
Output:Following is Depth First Traversal (starting from vertex 2) 2 0 1 3
-
Complexity Analysis:
- Time complexity: O(V + E), where V is the number of vertices and E is the number of edges in the graph.
- Space Complexity: O(V).
Since, an extra visited array is needed of size V.
Handling Disconnected Graph
- Solution: This will happen by handling a corner case.
The above code traverses only the vertices reachable from a given source vertex. All the vertices may not be reachable from a given vertex as in the case of a Disconnected graph. To do complete DFS traversal of such graphs, run DFS from all unvisited nodes after a DFS.
The recursive function remains the same. - Algorithm:
- Create a recursive function that takes the index of node and a visited array.
- Mark the current node as visited and print the node.
- Traverse all the adjacent and unmarked nodes and call the recursive function with index of adjacent node.
- Run a loop from 0 to number of vertices and check if the node is unvisited in previous DFS then call the recursive function with current node.
-
Implementation:
C++
// C++ program to print DFS traversal for a given given graph#include<bits/stdc++.h>usingnamespacestd;classGraph{intV;// No. of verticeslist<int> *adj;// Pointer to an array containing adjacency listsvoidDFSUtil(intv,boolvisited[]);// A function used by DFSpublic:Graph(intV);// ConstructorvoidaddEdge(intv,intw);// function to add an edge to graphvoidDFS();// prints DFS traversal of the complete graph};Graph::Graph(intV){this->V = V;adj =newlist<int>[V];}voidGraph::addEdge(intv,intw){adj[v].push_back(w);// Add w to v’s list.}voidGraph::DFSUtil(intv,boolvisited[]){// Mark the current node as visited and print itvisited[v] =true;cout << v <<" ";// Recur for all the vertices adjacent to this vertexlist<int>::iterator i;for(i = adj[v].begin(); i != adj[v].end(); ++i)if(!visited[*i])DFSUtil(*i, visited);}// The function to do DFS traversal. It uses recursive DFSUtil()voidGraph::DFS(){// Mark all the vertices as not visitedbool*visited =newbool[V];for(inti = 0; i < V; i++)visited[i] =false;// Call the recursive helper function to print DFS traversal// starting from all vertices one by onefor(inti = 0; i < V; i++)if(visited[i] ==false)DFSUtil(i, visited);}intmain(){// Create a graph given in the above diagramGraph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);cout <<"Following is Depth First Traversaln";g.DFS();return0;}chevron_rightfilter_noneJava
// Java program to print DFS traversal from a given given graphimportjava.io.*;importjava.util.*;// This class represents a directed graph using adjacency list// representationclassGraph{privateintV;// No. of vertices// Array of lists for Adjacency List RepresentationprivateLinkedList<Integer> adj[];// ConstructorGraph(intv){V = v;adj =newLinkedList[v];for(inti=0; i<v; ++i)adj[i] =newLinkedList();}//Function to add an edge into the graphvoidaddEdge(intv,intw){adj[v].add(w);// Add w to v's list.}// A function used by DFSvoidDFSUtil(intv,booleanvisited[]){// Mark the current node as visited and print itvisited[v] =true;System.out.print(v+" ");// Recur for all the vertices adjacent to this vertexIterator<Integer> i = adj[v].listIterator();while(i.hasNext()){intn = i.next();if(!visited[n])DFSUtil(n,visited);}}// The function to do DFS traversal. It uses recursive DFSUtil()voidDFS(){// Mark all the vertices as not visited(set as// false by default in java)booleanvisited[] =newboolean[V];// Call the recursive helper function to print DFS traversal// starting from all vertices one by onefor(inti=0; i<V; ++i)if(visited[i] ==false)DFSUtil(i, visited);}publicstaticvoidmain(String args[]){Graph g =newGraph(4);g.addEdge(0,1);g.addEdge(0,2);g.addEdge(1,2);g.addEdge(2,0);g.addEdge(2,3);g.addEdge(3,3);System.out.println("Following is Depth First Traversal");g.DFS();}}// This code is contributed by Aakash Hasijachevron_rightfilter_nonePython
# Python program to print DFS traversal for complete graphfromcollectionsimportdefaultdict# This class represents a directed graph using adjacency# list representationclassGraph:# Constructordef__init__(self):# default dictionary to store graphself.graph=defaultdict(list)# function to add an edge to graphdefaddEdge(self,u,v):self.graph[u].append(v)# A function used by DFSdefDFSUtil(self, v, visited):# Mark the current node as visited and print itvisited[v]=Trueprintv,# Recur for all the vertices adjacent to# this vertexforiinself.graph[v]:ifvisited[i]==False:self.DFSUtil(i, visited)# The function to do DFS traversal. It uses# recursive DFSUtil()defDFS(self):V=len(self.graph)#total vertices# Mark all the vertices as not visitedvisited=[False]*(V)# Call the recursive helper function to print# DFS traversal starting from all vertices one# by oneforiinrange(V):ifvisited[i]==False:self.DFSUtil(i, visited)# Driver code# Create a graph given in the above diagramg=Graph()g.addEdge(0,1)g.addEdge(0,2)g.addEdge(1,2)g.addEdge(2,0)g.addEdge(2,3)g.addEdge(3,3)print"Following is Depth First Traversal"g.DFS()# This code is contributed by Neelam Yadavchevron_rightfilter_noneC#
// C# program to print DFS traversal from a given given graphusingSystem;usingSystem.Collections.Generic;// This class represents a directed graph using adjacency list// representationpublicclassGraph{privateintV;// No. of vertices// Array of lists for Adjacency List RepresentationprivateList<int> []adj;// ConstructorGraph(intv){V = v;adj =newList<int>[v];for(inti = 0; i < v; ++i)adj[i] =newList<int>();}//Function to add an edge into the graphvoidaddEdge(intv,intw){adj[v].Add(w);// Add w to v's list.}// A function used by DFSvoidDFSUtil(intv,bool[]visited){// Mark the current node as visited and print itvisited[v] =true;Console.Write(v +" ");// Recur for all the vertices adjacent to this vertexforeach(intiinadj[v]){intn = i;if(!visited[n])DFSUtil(n, visited);}}// The function to do DFS traversal. It uses recursive DFSUtil()voidDFS(){// Mark all the vertices as not visited(set as// false by default in java)bool[]visited =newbool[V];// Call the recursive helper function to print DFS traversal// starting from all vertices one by onefor(inti = 0; i < V; ++i)if(visited[i] ==false)DFSUtil(i, visited);}// Driver codepublicstaticvoidMain(String []args){Graph g =newGraph(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);Console.WriteLine("Following is Depth First Traversal");g.DFS();}}// This code is contributed by PrinciRaj1992chevron_rightfilter_none
Output:Following is Depth First Traversal 0 1 2 3
-
Complexity Analysis:
- Time complexity: O(V + E), where V is the number of vertices and E is the number of edges in the graph.
- Space Complexity :O(V).
Since an extra visited array is needed of size V.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
Recommended Posts:
- Top 10 Interview Questions on Depth First Search (DFS)
- Iterative Deepening Search(IDS) or Iterative Deepening Depth First Search(IDDFS)
- Iterative Depth First Traversal of Graph
- Applications of Depth First Search
- Sum of minimum element at each depth of a given non cyclic graph
- Check if a graph is strongly connected | Set 1 (Kosaraju using DFS)
- Check if the given permutation is a valid DFS of graph
- Check if a given graph is Bipartite using DFS
- Tree, Back, Edge and Cross Edges in DFS of Graph
- Printing pre and post visited times in DFS of a graph
- Minimum number of edges between two vertices of a graph using DFS
- Print the lexicographically smallest DFS of the graph starting from 1
- Calculate number of nodes between two vertices in an acyclic Graph by DFS method
- Breadth First Search or BFS for a Graph
- Flatten a multi-level linked list | Set 2 (Depth wise)
- Replace every node with depth in N-ary Generic Tree
- Minimum valued node having maximum depth in an N-ary Tree
- Find the number of islands | Set 1 (Using DFS)
- BFS vs DFS for Binary Tree
- Calculate number of nodes in all subtrees | Using DFS


