What if you could explore every path without ever getting lost or repeating yourself?
Why DFS Depth First Search on Graph in DSA Typescript?
Imagine you have a huge maze with many paths and rooms. You want to find if there is a way to reach a special room starting from the entrance. If you try to check every path by guessing randomly or writing down every step manually, it will take forever and you might get lost or repeat the same paths.
Manually exploring each path in a maze is slow and confusing. You can easily miss some paths or go in circles. Writing down every step without a clear plan leads to mistakes and wastes time. It is hard to remember which rooms you already checked.
Depth First Search (DFS) is like having a smart helper who explores one path deeply before backtracking and trying another. It remembers where it has been, so it never repeats rooms. This way, it quickly finds if the special room is reachable or not, without getting lost or confused.
function findRoom(maze, start, target) {
// Try all paths randomly without tracking
// May repeat rooms or miss paths
}function dfs(graph, node, visited) {
if (visited.has(node)) return;
visited.add(node);
for (const neighbor of graph[node]) {
dfs(graph, neighbor, visited);
}
}DFS enables systematic and efficient exploration of all connected parts of a graph or maze, ensuring no path is missed or repeated.
Finding all friends in a social network starting from one person by exploring their friends, then friends of friends, and so on.
Manual path checking is slow and error-prone.
DFS explores deeply and remembers visited nodes.
DFS helps find connections or paths efficiently in graphs.
Practice
Solution
Step 1: Understand DFS traversal strategy
DFS explores nodes by going deep into one branch before backtracking to explore other branches.Step 2: Compare with other traversal methods
BFS visits neighbors first, but DFS goes deep first, matching Explore as far as possible along each branch before backtracking.Final Answer:
Explore as far as possible along each branch before backtracking -> Option AQuick Check:
DFS = deep exploration first [OK]
- Confusing DFS with BFS
- Thinking DFS visits neighbors first
- Assuming DFS visits nodes by distance
Solution
Step 1: Identify graph representation type
An adjacency list for a graph with numbered nodes is usually number[][], where each index holds neighbors.Step 2: Check parameter types
Start node is a number, so function signature with graph: number[][] and start: number is correct.Final Answer:
function dfs(graph: number[][], start: number): void -> Option CQuick Check:
Adjacency list = number[][], start node = number [OK]
- Using number[] instead of number[][] for adjacency list
- Using Map with incorrect value type
- Using string types for numeric graphs
const graph = [[1, 2], [2], [0, 3], [3]];
const visited: boolean[] = [];
const result: number[] = [];
function dfs(node: number) {
if (visited[node]) return;
visited[node] = true;
result.push(node);
for (const neighbor of graph[node]) {
dfs(neighbor);
}
}
dfs(0);
console.log(result);Solution
Step 1: Start DFS at node 0
Visit 0, mark visited, add to result: [0]. Neighbors: 1, 2.Step 2: Visit neighbor 1
Visit 1, mark visited, add: [0,1]. Neighbor: 2.Step 3: Visit neighbor 2 from 1
Visit 2, mark visited, add: [0,1,2]. Neighbors: 0 (visited), 3.Step 4: Visit neighbor 3 from 2
Visit 3, mark visited, add: [0,1,2,3]. Neighbor: 3 (already visited).Final Answer:
[0, 2, 1, 3] -> Option BQuick Check:
DFS order = [0,2,1,3] [OK]
- Not marking nodes visited before recursion
- Visiting neighbors in wrong order
- Ignoring already visited nodes
function dfs(node: number, graph: number[][], visited: boolean[]) {
visited[node] = true;
for (const neighbor of graph[node]) {
if (!visited[neighbor]) {
dfs(neighbor, graph, visited);
}
}
}
const graph = [[1], [2], [0]];
const visited = new Array(graph.length).fill(false);
dfs(0, graph, visited);
console.log(visited);Solution
Step 1: Check visited marking timing
Visited[node] is marked true before recursion, preventing revisits.Step 2: Verify recursion and base case
Recursion only happens if neighbor not visited, so no infinite loops.Final Answer:
No bug, code works correctly -> Option DQuick Check:
Visited marked before recursion = correct DFS [OK]
- Marking visited after recursion causing infinite loops
- Initializing visited array incorrectly
- Missing base case check
Solution
Step 1: Understand cycle detection in DFS
Detecting cycles requires knowing if a node is in the current recursion path (stack).Step 2: Use recursion stack tracking
Maintain a separate array to track nodes currently in recursion; if a neighbor is in this stack, a cycle exists.Step 3: Evaluate other options
Marking visited after neighbors or using BFS won't reliably detect cycles; ignoring visited nodes causes infinite loops.Final Answer:
Use a recursion stack array to track nodes in the current path and detect back edges -> Option AQuick Check:
Cycle detection = recursion stack tracking [OK]
- Not tracking recursion stack causing missed cycles
- Using BFS which doesn't track recursion path
- Marking visited too late or ignoring visited nodes
Ready to prove it?
Pass the test and this pattern moves unknown
