What if you could explore every corner of a complex maze without ever getting lost or repeating steps?
Why DFS Depth First Search on Graph in DSA Javascript?
Imagine you have a huge maze with many paths and dead ends. You want to find a way to explore every corner of this maze, but you only have a simple list of paths without any guide.
You try to remember every path you took and backtrack manually when you hit a dead end.
Manually exploring the maze is slow and confusing. You might get lost or repeat the same paths many times. It's hard to keep track of where you have been and where you still need to go.
This makes finding all places in the maze very tiring and error-prone.
Depth First Search (DFS) is like having a smart helper who always goes as deep as possible down one path before backtracking. It remembers where it has been so it never repeats the same place.
This way, DFS explores the entire maze efficiently and clearly, without getting lost or confused.
function exploreMaze(paths) {
// Manually try each path and remember visited places
// No clear way to avoid repeats or dead ends
}function dfs(graph, start, visited = new Set()) {
visited.add(start);
for (const neighbor of graph[start]) {
if (!visited.has(neighbor)) dfs(graph, neighbor, visited);
}
}DFS lets you explore complex networks or mazes completely and efficiently, unlocking solutions to problems like finding paths, checking connections, and more.
Think about social networks: DFS helps find all friends connected to you by exploring each friend's connections deeply before moving on.
Manual exploration is slow and confusing.
DFS explores deeply and remembers visited places.
It helps solve many real-world problems involving connections.
Practice
Solution
Step 1: Understand DFS traversal
DFS explores a path deeply before moving to another path.Step 2: Compare with other traversals
BFS visits nodes level by level, but DFS goes deep first.Final Answer:
It explores as far as possible along each branch before backtracking. -> Option CQuick Check:
DFS = deep exploration first [OK]
- Confusing DFS with BFS
- Thinking DFS visits nodes randomly
- Assuming DFS only visits direct neighbors
graph?Solution
Step 1: Identify suitable data structure for visited nodes
A Set is ideal to track visited nodes efficiently.Step 2: Check function signature correctness
Usingvisited = new Set()initializes visited nodes properly.Final Answer:
function dfs(node, visited = new Set()) { -> Option AQuick Check:
Use Set for visited nodes [OK]
- Using array or object incorrectly for visited
- Initializing visited as a number
- Not initializing visited parameter
const graph = {
1: [2, 3],
2: [4],
3: [],
4: []
};
function dfs(node, visited = new Set()) {
visited.add(node);
for (const neighbor of graph[node]) {
if (!visited.has(neighbor)) {
dfs(neighbor, visited);
}
}
return Array.from(visited);
}
console.log(dfs(1));What is the output?
Solution
Step 1: Start DFS from node 1
Visit 1, then neighbors 2 and 3 in order.Step 2: Visit neighbors recursively
From 2, visit 4. From 3, no neighbors. Order: 1, 2, 4, 3.Final Answer:
[1, 2, 4, 3] -> Option DQuick Check:
DFS order = 1,2,4,3 [OK]
- Visiting neighbors in wrong order
- Confusing BFS order with DFS
- Not converting Set to array properly
const graph = {
1: [2, 3],
2: [4],
3: [],
4: []
};
function dfs(node, visited = new Set()) {
visited.add(node);
for (const neighbor of graph[node]) {
if (visited.has(neighbor)) {
dfs(neighbor, visited);
}
}
return visited;
}
console.log(Array.from(dfs(1)));
Solution
Step 1: Check the neighbor visit condition
It incorrectly calls dfs if neighbor is already visited, causing infinite recursion.Step 2: Correct the condition
Change to if (!visited.has(neighbor)) to visit unvisited neighbors only.Final Answer:
The condition should be if (!visited.has(neighbor)) instead of if (visited.has(neighbor)) -> Option AQuick Check:
Visit only unvisited neighbors [OK]
- Calling DFS on already visited nodes
- Using wrong data structure for visited
- Returning wrong type from DFS
const graph = {
1: [2, 3],
2: [4],
3: [5],
4: [],
5: []
};
function dfs(node, target, visited = new Set()) {
if (node === target) return true;
visited.add(node);
for (const neighbor of graph[node]) {
if (!visited.has(neighbor)) {
if (dfs(neighbor, target, visited)) return true;
}
}
return false;
}
console.log(dfs(1, 5));What will be the output and why?
Solution
Step 1: Check DFS path search logic
DFS returns true immediately when target node is found.Step 2: Trace path from 1 to 5
Path exists: 1 -> 3 -> 5, so DFS returns true.Final Answer:
true, because DFS finds a path 1 -> 3 -> 5 -> Option BQuick Check:
DFS finds path = true [OK]
- Assuming direct connection needed
- Ignoring early return on target found
- Not updating visited set properly
Ready to prove it?
Pass the test and this pattern moves unknown
