Graphs
Depth-First Search (Recursive)
Visit a start vertex, then recurse into its first unvisited neighbour all
the way down before backtracking. A visited set prevents revisiting, and
neighbour insertion order fixes the visit sequence.
Algorithm
On the canonical 6-vertex graph from graph-adjacency-list, starting at
vertex 1, the deterministic visit order is [1, 2, 4, 3, 5, 6]. Calls
unwind 6 -> 5 -> 4 -> 3 -> 2 -> 1 after all vertices are visited.
recursive descent
Follow one branch to its end, then unwind and try the next neighbour.
Visual walkthrough
Basic Implementation
basic.kt
fun main() {
val adj = HashMap<Int, List<Int>>()
adj[1] = listOf(2, 3)
adj[2] = listOf(1, 4)
adj[3] = listOf(1, 4)
adj[4] = listOf(2, 3, 5)
adj[5] = listOf(4, 6)
adj[6] = listOf(5)
val visited = HashSet<Int>()
val order = mutableListOf<Int>()
fun dfs(v: Int) {
visited.add(v)
order.add(v)
for (nb in adj[v]!!) {
if (!visited.contains(nb)) {
dfs(nb)
}
}
}
dfs(1)
println(order.joinToString(prefix = "[", postfix = "]"))
}
Complexity
- Time: O(V + E)
- Space: O(V) recursion depth
Implementation notes
- Kotlin: a local recursive
dfscloses over the sharedvisitedset andorderlist. - The replay shows the current vertex, the visited set, and the running visit order after each entry, matching the lesson spec.