Bird
Raised Fist0
DSA Rustprogramming~5 mins

DFS Depth First Search on Graph in DSA Rust - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does DFS stand for in graph traversal?
DFS stands for Depth First Search, a method to explore graph nodes by going as deep as possible before backtracking.
Click to reveal answer
beginner
In DFS, what data structure is commonly used to keep track of nodes to visit next?
A stack is commonly used in DFS to keep track of nodes to visit next, either explicitly or via recursion call stack.
Click to reveal answer
intermediate
What is the main difference between DFS and BFS in graph traversal?
DFS explores as far as possible along each branch before backtracking, while BFS explores all neighbors at the current depth before moving deeper.
Click to reveal answer
beginner
Why do we mark nodes as visited in DFS?
Marking nodes as visited prevents revisiting the same node, avoiding infinite loops especially in graphs with cycles.
Click to reveal answer
intermediate
How does recursion help in implementing DFS?
Recursion naturally uses the call stack to remember the path, allowing DFS to explore deep nodes and backtrack automatically.
Click to reveal answer
Which data structure does DFS primarily use to explore nodes?
AHeap
BQueue
CStack
DHash Map
What is the first step in DFS when starting from a node?
AMark the node as visited
BAdd all neighbors to the queue
CRemove the node from the graph
DSort the neighbors
What happens if you do not mark nodes as visited in DFS on a graph with cycles?
ADFS will terminate immediately
BDFS may enter an infinite loop
CDFS will skip nodes
DDFS will convert to BFS
Which of these is NOT a typical use case of DFS?
AFinding connected components
BTopological sorting
CDetecting cycles
DFinding shortest path in unweighted graph
In DFS, what does backtracking mean?
AGoing back to the previous node after exploring deeper
BSkipping nodes
CReversing the graph edges
DSorting nodes in reverse order
Explain how DFS explores a graph starting from a given node.
Think about going deep first before moving sideways.
You got /4 concepts.
    Describe why marking nodes as visited is important in DFS on graphs with cycles.
    What happens if you keep visiting the same nodes again?
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main idea behind Depth First Search (DFS) on a graph?
      easy
      A. Explore as far as possible along each branch before backtracking
      B. Visit all nodes at the current depth before moving deeper
      C. Visit nodes randomly without any order
      D. Only visit nodes with the highest value first

      Solution

      1. Step 1: Understand DFS traversal

        DFS explores a graph by going deep into one branch before exploring others.
      2. Step 2: Compare with other traversal methods

        BFS visits nodes level by level, but DFS goes deep first.
      3. Final Answer:

        Explore as far as possible along each branch before backtracking -> Option A
      4. Quick Check:

        DFS = deep exploration first [OK]
      Hint: DFS means go deep first, then backtrack [OK]
      Common Mistakes:
      • Confusing DFS with BFS
      • Thinking DFS visits nodes level-wise
      • Assuming DFS visits nodes randomly
      2. Which of the following is the correct Rust function signature for a recursive DFS function on a graph represented as adjacency list?
      easy
      A. fn dfs(graph: &mut Vec, node: usize, visited: Vec<bool>)
      B. fn dfs(graph: Vec, node: usize, visited: Vec<bool>)
      C. fn dfs(graph: &Vec, node: usize, visited: &mut Vec<bool>)
      D. fn dfs(graph: Vec, node: usize, visited: &mut Vec<bool>)

      Solution

      1. Step 1: Understand parameter passing in Rust for DFS

        The graph should be passed by reference to avoid copying, and visited vector should be mutable reference to mark nodes visited.
      2. Step 2: Check each option

        fn dfs(graph: &Vec, node: usize, visited: &mut Vec<bool>) passes graph by reference and visited as mutable reference, which is correct for DFS recursion.
      3. Final Answer:

        fn dfs(graph: &Vec, node: usize, visited: &mut Vec<bool>) -> Option C
      4. Quick Check:

        Graph by ref + visited mutable ref = correct DFS signature [OK]
      Hint: Pass graph by ref and visited as mutable ref [OK]
      Common Mistakes:
      • Passing graph or visited by value causing copies
      • Not using mutable reference for visited
      • Using mutable reference for graph unnecessarily
      3. What is the output of the following Rust DFS traversal starting from node 0?
      fn dfs(graph: &Vec, node: usize, visited: &mut Vec<bool>, result: &mut Vec<usize>) {
          visited[node] = true;
          result.push(node);
          for &neighbor in &graph[node] {
              if !visited[neighbor] {
                  dfs(graph, neighbor, visited, result);
              }
          }
      }
      
      fn main() {
          let graph = vec![
              vec![1, 2],
              vec![0, 3],
              vec![0],
              vec![1]
          ];
          let mut visited = vec![false; 4];
          let mut result = Vec::new();
          dfs(&graph, 0, &mut visited, &mut result);
          println!("{:?}", result);
      }
      medium
      A. [0, 2, 1, 3]
      B. [0, 1, 3, 2]
      C. [0, 1, 2, 3]
      D. [1, 0, 2, 3]

      Solution

      1. Step 1: Trace DFS starting at node 0

        Start at 0, mark visited, add 0. Neighbors: 1, 2. Visit 1 first.
      2. Step 2: Continue DFS from node 1

        Visit 1, add 1. Neighbors: 0 (visited), 3 (not visited). Visit 3 next.
      3. Step 3: Visit node 3

        Visit 3, add 3. Neighbor: 1 (visited). Backtrack to 0 and visit 2.
      4. Step 4: Visit node 2

        Visit 2, add 2. Neighbor: 0 (visited). DFS complete.
      5. Final Answer:

        [0, 1, 3, 2] -> Option B
      6. Quick Check:

        DFS order from 0 = [0,1,3,2] [OK]
      Hint: Follow neighbors in order, mark visited, backtrack [OK]
      Common Mistakes:
      • Visiting neighbors out of order
      • Not marking visited nodes
      • Confusing BFS order with DFS
      4. Identify the bug in this DFS Rust code snippet and choose the fix:
      fn dfs(graph: &Vec, node: usize, visited: &mut Vec<bool>) {
          visited[node] = true;
          for neighbor in &graph[node] {
              if visited[*neighbor] {
                  dfs(graph, *neighbor, visited);
              }
          }
      }
      medium
      A. Change if visited[*neighbor] to if !visited[*neighbor]
      B. Change visited[node] = true to visited[node] = false
      C. Remove the for loop and call dfs only once
      D. Change neighbor to node inside the loop

      Solution

      1. Step 1: Analyze the condition for recursive DFS call

        The code calls dfs only if visited[*neighbor] is true, meaning already visited nodes are revisited, causing infinite recursion.
      2. Step 2: Correct the condition to avoid revisiting

        Change condition to if !visited[*neighbor] to visit only unvisited neighbors.
      3. Final Answer:

        Change if visited[*neighbor] to if !visited[*neighbor] -> Option A
      4. Quick Check:

        Visit unvisited neighbors only [OK]
      Hint: Call DFS only on unvisited neighbors [OK]
      Common Mistakes:
      • Calling DFS on visited nodes causing infinite loops
      • Incorrectly marking nodes as unvisited
      • Removing necessary loops
      5. Given a graph with possible cycles, how can you modify DFS in Rust to detect if the graph contains a cycle?
      hard
      A. Use BFS instead of DFS to detect cycles
      B. Only mark nodes visited after all neighbors are visited
      C. Ignore visited nodes and continue traversal
      D. Use a recursion stack (call stack) boolean vector to track nodes in the current path and detect back edges

      Solution

      1. Step 1: Understand cycle detection in DFS

        To detect cycles, track nodes currently in recursion stack to find back edges indicating cycles.
      2. Step 2: Implement recursion stack tracking

        Use a boolean vector to mark nodes in current DFS path; if a neighbor is in this stack, a cycle exists.
      3. Step 3: Other options are incorrect

        Marking visited after neighbors or using BFS won't detect cycles reliably; ignoring visited nodes causes infinite loops.
      4. Final Answer:

        Use a recursion stack (call stack) boolean vector to track nodes in the current path and detect back edges -> Option D
      5. Quick Check:

        Recursion stack tracks cycles in DFS [OK]
      Hint: Track recursion stack to find cycles in DFS [OK]
      Common Mistakes:
      • Not tracking recursion stack causing missed cycles
      • Using BFS which needs extra logic for cycles
      • Ignoring visited nodes causing infinite loops
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard