Introduction
Prerequisites: Recursion, Stack
A depth first search (DFS) is a search that goes as far as possible before backtracking. The search requires a stack but DFS is usually implemented with recursion which uses the system stack. So most of the time you do not need an explicit stack.
- Push the root into the stack.
- Pop the first element from the stack and push all of its non-visited neighbours to the stack.
- Repeat until the stack is empty.

Implementation
Most of the time, DFS is implemented using recursion and it is very short and simple to code.
public class Tree {
int value;
Tree left;
Tree right;
}
Binary Tree Traversal

Implementation for outputting a binary tree in order from left to right using DFS:
public static void DFS(Tree cur) {
if (cur == null) {
return;
}
DFS(cur.left);
System.out.println(cur.value);
DFS(cur.right);
}
Binary Tree Preorder

Implementation for outputting a binary tree in DFS pre order:
public static void DFS(Tree cur) {
if (cur == null) {
return;
}
System.out.println(cur.value);
DFS(cur.left);
DFS(cur.right);
}
Binary Tree Postorder

Implementation for outputting a binary tree in DFS postorder:
public static void DFS(Tree cur) {
if (cur == null) {
return;
}
DFS(cur.left);
DFS(cur.right);
System.out.println(cur.value);
}
Graph Traversal
This is a DFS implementation for traversing a bidirectional graph with positive weights:
public static void DFS_graph(int[][] adjMatrix, int cur, boolean[] visited) {
if (visited[cur]) {
return;
}
visited[cur] = true;
System.out.println(cur);
for (int i = 0; i < adjMatrix.length; i++) {
if (adjMatrix[cur][i] > 0) {
DFS_graph(adjMatrix, i, visited);
}
}
return;
}
Exercises
- Given a binary tree, find the its height (the longest path from the root to a leaf)
- Given a graph and two nodes X and Y, determine if a path exists between X and Y.
- Given a node and a binary tree, find the next node in post order, pre order and normal order.