const graph = new Map<number, number[]>([ [0, [1, 2]], [1, [3]], [2, []], [3, []] ]); function dfs(node: number, visited: Set<number>, graph: Map<number, number[]>, result: number[]) { visited.add(node); result.push(node); for (const neighbor of graph.get(node) || []) { if (!visited.has(neighbor)) { dfs(neighbor, visited, graph, result); } } } const visited = new Set<number>(); const result: number[] = []; dfs(0, visited, graph, result); console.log(result.join(' -> ') + ' -> null');
The DFS starts at node 0, visits 1 first (the first neighbor), then goes deeper to 3. After finishing 3, it backtracks and visits 2.
const graph = new Map<number, number[]>([ [0, [1]], [1, [2]], [2, [3]], [3, []], [4, [0]] ]);
Starting at node 2, DFS visits 2, then 3. Node 3 has no neighbors. So nodes visited are 2 and 3. But node 2 also connects to 3 only, so total 2 nodes visited.
However, check carefully: Node 2 connects to 3 only, so nodes visited are 2 and 3 only, total 2 nodes.
const graph = new Map<number, number[]>([ [0, [1]], [1, [2]], [2, [0, 3]], [3, []] ]); function dfs(node: number, visited: Set<number>, graph: Map<number, number[]>, result: number[]) { visited.add(node); result.push(node); for (const neighbor of graph.get(node) || []) { if (!visited.has(neighbor)) { dfs(neighbor, visited, graph, result); } } } const visited = new Set<number>(); const result: number[] = []; dfs(0, visited, graph, result); console.log(result.join(' -> ') + ' -> null');
DFS starts at 0, visits 1, then 2. From 2, it tries to visit 0 but 0 is already visited, so it skips. Then it visits 3.
const graph = new Map<number, number[]>([ [0, [1]], [1, [2]], [2, []] ]); function dfs(node: number, visited: Set<number>, graph: Map<number, number[]>, result: number[]) { if (visited.has(node)) return; result.push(node); for (const neighbor of graph.get(node)!) { dfs(neighbor, visited, graph, result); } } const visited = new Set<number>(); const result: number[] = []; dfs(0, visited, graph, result); console.log(result.join(' -> ') + ' -> null');
Although the visited set is never updated (missing visited.add(node)), this graph is acyclic with no back edges, so no node is revisited. The recursion terminates normally, producing output '0 -> 1 -> 2 -> null'. In graphs with cycles, it would cause stack overflow.
const graph = new Map<number, number[]>([ [0, [1]], [1, [0]], [2, [3]], [3, [2]], [4, []] ]); function dfs(node: number, visited: Set<number>, graph: Map<number, number[]>) { visited.add(node); for (const neighbor of graph.get(node) || []) { if (!visited.has(neighbor)) { dfs(neighbor, visited, graph); } } } const visited = new Set<number>(); let count = 0; for (const node of graph.keys()) { if (!visited.has(node)) { dfs(node, visited, graph); count++; } } console.log(count);
Nodes 0 and 1 form one component, nodes 2 and 3 form another, and node 4 alone is the third component.