Bird
Raised Fist0
DSA C#programming~5 mins

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

Choose your learning style10 modes available
Recall & Review
beginner
What is the main idea behind Depth First Search (DFS) on a graph?
DFS explores as far as possible along each branch before backtracking, visiting nodes deeply before moving to siblings.
Click to reveal answer
beginner
In DFS, what data structure is commonly used to keep track of nodes to visit next?
A stack is used to keep track of nodes to visit next, either explicitly or via recursion call stack.
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 and repeated work.
Click to reveal answer
intermediate
What is the time complexity of DFS on a graph with V vertices and E edges?
The time complexity is O(V + E) because each vertex and edge is explored once.
Click to reveal answer
intermediate
How does DFS differ when implemented recursively versus iteratively?
Recursive DFS uses the call stack to manage nodes, while iterative DFS uses an explicit stack data structure.
Click to reveal answer
What data structure does recursive DFS implicitly use to track nodes?
AQueue
BStack
CHeap
DArray
What happens if you do not mark nodes as visited in DFS on a graph with cycles?
ADFS will terminate normally
BDFS will skip some nodes
CDFS will visit nodes in random order
DDFS may enter an infinite loop
Which of these is NOT a typical use case of DFS?
AFinding shortest path in unweighted graph
BTopological sorting
CFinding connected components
DDetecting cycles
In DFS, what is the order of node visits called?
ABreadth-first order
BRandom order
CDepth-first order
DLevel order
What is the space complexity of DFS on a graph with V vertices?
AO(V)
BO(V + E)
CO(E)
DO(1)
Explain how DFS explores a graph starting from a given node.
Think about going deep before wide.
You got /5 concepts.
    Describe the difference between recursive and iterative DFS implementations.
    Focus on how the next node to visit is stored.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main idea behind Depth First Search (DFS) on a graph?
      easy
      A. Visit nodes in order of their distance from the start node
      B. Visit all neighbors of a node before moving deeper
      C. Explore as far as possible along each branch before backtracking
      D. Randomly visit nodes until all are visited

      Solution

      1. Step 1: Understand DFS traversal

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

        BFS visits neighbors first, but DFS goes deep first.
      3. Final Answer:

        Explore as far as possible along each branch before backtracking -> Option C
      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 neighbors first
      • Assuming DFS visits nodes by distance
      2. Which of the following is the correct way to start a DFS traversal in C# using recursion on a graph represented by adjacency list Dictionary<int, List<int>> graph?
      easy
      A. void DFS(int node, HashSet<int> visited) { if (visited.Contains(node)) return; visited.Add(node); foreach (var neighbor in graph[node]) DFS(neighbor, visited); }
      B. void DFS(int node) { visited.Add(node); foreach (var neighbor in graph[node]) DFS(neighbor); }
      C. void DFS(int node, List<int> visited) { if (visited.Contains(node)) return; visited.Add(node); foreach (var neighbor in graph[node]) DFS(neighbor, visited); }
      D. void DFS(int node, HashSet<int> visited) { visited.Add(node); foreach (var neighbor in graph) DFS(neighbor, visited); }

      Solution

      1. Step 1: Check parameters and visited tracking

        void DFS(int node, HashSet<int> visited) { if (visited.Contains(node)) return; visited.Add(node); foreach (var neighbor in graph[node]) DFS(neighbor, visited); } uses HashSet to track visited nodes and prevents revisiting.
      2. Step 2: Verify iteration over neighbors

        void DFS(int node, HashSet<int> visited) { if (visited.Contains(node)) return; visited.Add(node); foreach (var neighbor in graph[node]) DFS(neighbor, visited); } correctly iterates over neighbors of the current node from the graph dictionary.
      3. Final Answer:

        void DFS(int node, HashSet<int> visited) { if (visited.Contains(node)) return; visited.Add(node); foreach (var neighbor in graph[node]) DFS(neighbor, visited); } -> Option A
      4. Quick Check:

        Correct recursion with visited check [OK]
      Hint: Use HashSet to track visited nodes in DFS recursion [OK]
      Common Mistakes:
      • Not checking if node is visited before recursion
      • Using List instead of HashSet for visited (slow lookup)
      • Iterating over graph keys instead of neighbors
      3. Given the graph adjacency list:
      var graph = new Dictionary {
        {1, new List<int>{2, 3}},
        {2, new List<int>{4}},
        {3, new List<int>{4}},
        {4, new List<int>()}
      };
      
      List<int> visited = new List<int>();
      DFS(1, visited); // DFS as defined in option C above
      Console.WriteLine(string.Join(", ", visited));

      What is the output?
      medium
      A. 1, 2, 3, 4
      B. 1, 2, 4, 3
      C. 1, 3, 4, 2
      D. 1, 4, 2, 3

      Solution

      1. Step 1: Start DFS from node 1

        Visit 1, mark visited. Neighbors: 2, 3.
      2. Step 2: Visit neighbor 2 first

        Visit 2, then its neighbor 4. 4 has no neighbors, backtrack.
      3. Step 3: Backtrack to 1 and visit neighbor 3

        Visit 3, then neighbor 4 (already visited, skip).
      4. Step 4: Order of visited nodes

        Visited nodes in order: 1, 2, 4, 3.
      5. Final Answer:

        1, 2, 4, 3 -> Option B
      6. Quick Check:

        DFS order = 1,2,4,3 [OK]
      Hint: DFS visits neighbors in order, backtracks after deepest node [OK]
      Common Mistakes:
      • Assuming BFS order instead of DFS
      • Visiting node 3 before node 2
      • Revisiting already visited nodes
      4. Consider this DFS code snippet in C#:
      void DFS(int node, HashSet<int> visited) {
        visited.Add(node);
        foreach (var neighbor in graph.Keys) {
          if (!visited.Contains(neighbor)) {
            DFS(neighbor, visited);
          }
        }
      }

      What is the main problem with this DFS implementation?
      medium
      A. It iterates over all graph nodes instead of neighbors of the current node
      B. It does not add the current node to visited
      C. It uses List instead of HashSet for visited nodes
      D. It does not check if the node is null before recursion

      Solution

      1. Step 1: Analyze the foreach loop

        The loop iterates over all keys in the graph, not neighbors of the current node.
      2. Step 2: Understand DFS neighbor traversal

        DFS should explore neighbors of the current node, not all nodes in the graph.
      3. Final Answer:

        It iterates over all graph nodes instead of neighbors of the current node -> Option A
      4. Quick Check:

        DFS must visit neighbors, not all nodes [OK]
      Hint: Loop over neighbors, not all graph keys [OK]
      Common Mistakes:
      • Looping over graph.Keys instead of graph[node]
      • Forgetting to add node to visited
      • Not checking visited before recursion
      5. You want to find if there is a path from node 1 to node 5 in this directed graph:
      var graph = new Dictionary {
        {1, new List<int>{2, 3}},
        {2, new List<int>{4}},
        {3, new List<int>{4, 5}},
        {4, new List<int>{}},
        {5, new List<int>{}}
      };
      
      bool DFS(int current, int target, HashSet<int> visited) {
        if (current == target) return true;
        visited.Add(current);
        foreach (var neighbor in graph[current]) {
          if (!visited.Contains(neighbor)) {
            if (DFS(neighbor, target, visited)) return true;
          }
        }
        return false;
      }
      
      var visited = new HashSet<int>();
      bool result = DFS(1, 5, visited);
      Console.WriteLine(result);

      What will be printed?
      hard
      A. Runtime exception
      B. False
      C. Compilation error
      D. True

      Solution

      1. Step 1: Start DFS from node 1 looking for 5

        Visit 1, neighbors 2 and 3.
      2. Step 2: Explore neighbor 2

        From 2, visit 4. 4 has no neighbors, backtrack.
      3. Step 3: Explore neighbor 3

        From 3, neighbors are 4 and 5. 4 visited, then 5 found matches target.
      4. Step 4: DFS returns true when target found

        DFS returns true and prints True.
      5. Final Answer:

        True -> Option D
      6. Quick Check:

        Path exists from 1 to 5 [OK]
      Hint: DFS returns true immediately when target found [OK]
      Common Mistakes:
      • Assuming no path because 5 is not direct neighbor
      • Not returning true when target found
      • Forgetting to mark visited nodes
      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