Graphs / Beginner
Depth-First Search Visualizer
Go as deep as possible along one path, then back up and try the next branch. The call stack remembers where to return.
Start the Depth-First Search simulation → Step forward and back, change the input, follow the code line by line in Java, Python, C++, C or JavaScript. Free, no sign-up.
Time and space complexity
| Best time | O(V+E) |
|---|---|
| Average time | O(V+E) |
| Worst time | O(V+E) |
| Extra space | O(V) |
Worked example, step by step
The same steps the simulator shows, on a small input.
- Call dfs(A) and mark A seen.
- Visit A.
- B is not seen yet. Go deeper into B.
- Call dfs(B) and mark B seen.
- Visit B.
- A was already seen. Skip it.
- C is not seen yet. Go deeper into C.
- Call dfs(C) and mark C seen.
- Visit C.
- A was already seen. Skip it.
- B was already seen. Skip it.
- D is not seen yet. Go deeper into D.
- Call dfs(D) and mark D seen.
- Visit D.
- B was already seen. Skip it.
- C was already seen. Skip it.
- E is not seen yet. Go deeper into E.
- Call dfs(E) and mark E seen.
- Visit E.
- C was already seen. Skip it.
- … 13 more steps …
- B has no unseen neighbors left. Return to A.
- C was already seen. Skip it.
- A has no unseen neighbors left. Return.
- Done. Visit order: A, B, C, D, E, F.
Depth-first search in Java, Python, C++, C and JavaScript
void dfs(int u, boolean[] seen) {
seen[u] = true;
visit(u);
for (int v : adj[u]) {
if (!seen[v]) {
dfs(v, seen);
}
}
}
def dfs(adj, u, seen):
seen[u] = True
visit(u)
for v in adj[u]:
if not seen[v]:
dfs(adj, v, seen)
void dfs(const vector<vector<int>>& adj, int u, vector<bool>& seen) {
seen[u] = true;
visit(u);
for (int v : adj[u]) {
if (!seen[v]) {
dfs(adj, v, seen);
}
}
}
#define MAXN 100
int adj[MAXN][MAXN], deg[MAXN];
void dfs(int u, int seen[]) {
seen[u] = 1;
visit(u);
for (int k = 0; k < deg[u]; k++) {
int v = adj[u][k];
if (!seen[v]) {
dfs(v, seen);
}
}
}
function dfs(adj, u, seen) {
seen[u] = true;
visit(u);
for (const v of adj[u]) {
if (!seen[v]) {
dfs(adj, v, seen);
}
}
}In an interview
DFS is the base for cycle detection, topological sort, connected components and most backtracking problems.
More graphs
- Breadth-First Search visualizer
- Dijkstra's Shortest Path visualizer
- Bellman-Ford Shortest Path visualizer
- Floyd-Warshall All-Pairs Shortest Paths visualizer
- Topological Sort (Kahn) visualizer
- Detect a Cycle in a Directed Graph visualizer
- Union-Find (Disjoint Sets) visualizer
- Kruskal's Minimum Spanning Tree visualizer