Bird
Raised Fist0
DSA Rustprogramming~20 mins

Why Graphs Exist and What Trees Cannot Model in DSA Rust - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Graph Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Why can't trees model all relationships?

Which of the following scenarios cannot be properly modeled by a tree structure?

AA family tree showing parent-child relationships
BA social network where people can be friends with multiple others
CA company's organizational chart with one CEO at the top
DA file system directory with folders and subfolders
Attempts:
2 left
💡 Hint

Think about whether each node can have multiple parents or cycles.

❓ Predict Output
intermediate
2:00remaining
Output of graph adjacency list with cycles

What is the printed adjacency list after adding edges in this Rust code?

DSA Rust
use std::collections::HashMap;

fn main() {
    let mut graph: HashMap<&str, Vec<&str>> = HashMap::new();
    graph.entry("A").or_default().push("B");
    graph.entry("B").or_default().push("C");
    graph.entry("C").or_default().push("A");
    for (node, edges) in &graph {
        println!("{} -> {:?}", node, edges);
    }
}
A
A -&gt; ["B"]
B -&gt; ["C"]
C -&gt; ["A"]
B
A -&gt; ["B"]
B -&gt; ["C"]
C -&gt; []
C
A -&gt; []
B -&gt; ["C"]
C -&gt; ["A"]
D
A -&gt; ["B", "C"]
B -&gt; ["C"]
C -&gt; ["A"]
Attempts:
2 left
💡 Hint

Check which edges are added for each node.

🔧 Debug
advanced
2:30remaining
Why does this tree code fail to model multiple parents?

Given this Rust code for a tree node, why can't it represent a graph where a node has multiple parents?

DSA Rust
struct TreeNode {
    value: i32,
    children: Vec<TreeNode>,
}

fn main() {
    let child = TreeNode { value: 2, children: vec![] };
    let parent1 = TreeNode { value: 1, children: vec![child] };
    let parent2 = TreeNode { value: 3, children: vec![child] };
}
ARust does not allow multiple ownership of the same child node in this structure
BThe code has a syntax error because children must be references
CThe tree structure allows cycles, so this is valid
DThe child node is copied automatically, so parents have different children
Attempts:
2 left
💡 Hint

Think about ownership and how Rust handles data in vectors.

🚀 Application
advanced
2:00remaining
Choosing data structure for city road network

You want to model a city's road network where intersections connect multiple roads and some roads loop back. Which data structure fits best?

AA tree, because roads branch out from main intersections
BA linked list, because roads connect one after another
CA graph, because intersections can connect multiple roads and loops exist
DA stack, because roads can be traversed in reverse order
Attempts:
2 left
💡 Hint

Consider if the structure allows cycles and multiple connections per node.

❓ Predict Output
expert
3:00remaining
Detecting cycle in graph adjacency list

What is the output of this Rust code that tries to detect a cycle in a directed graph?

DSA Rust
use std::collections::{HashMap, HashSet};

fn has_cycle(node: &str, graph: &HashMap<&str, Vec<&str>>, visited: &mut HashSet<&str>, stack: &mut HashSet<&str>) -> bool {
    if stack.contains(node) {
        return true;
    }
    if visited.contains(node) {
        return false;
    }
    visited.insert(node);
    stack.insert(node);
    if let Some(neighbors) = graph.get(node) {
        for &neighbor in neighbors {
            if has_cycle(neighbor, graph, visited, stack) {
                return true;
            }
        }
    }
    stack.remove(node);
    false
}

fn main() {
    let mut graph: HashMap<&str, Vec<&str>> = HashMap::new();
    graph.insert("A", vec!["B"]);
    graph.insert("B", vec!["C"]);
    graph.insert("C", vec!["D"]);
    graph.insert("D", vec!["B"]);

    let mut visited = HashSet::new();
    let mut stack = HashSet::new();
    let result = has_cycle("A", &graph, &mut visited, &mut stack);
    println!("Cycle detected: {}", result);
}
ARuntime panic due to stack overflow
BCycle detected: false
CCompilation error due to mutable borrow
DCycle detected: true
Attempts:
2 left
💡 Hint

Trace the recursion and check if the cycle B->C->D->B is detected.

Practice

(1/5)
1. Why do we need graphs when we already have trees in data structures?
easy
A. Because graphs can represent connections between nodes that trees cannot, like cycles and multiple parents.
B. Because trees are faster to traverse than graphs.
C. Because trees use less memory than graphs.
D. Because graphs only store numbers, while trees store strings.

Solution

  1. Step 1: Understand tree structure limitations

    Trees have a strict hierarchy where each node has only one parent and no cycles.
  2. Step 2: Identify graph capabilities

    Graphs allow nodes to have multiple connections, including cycles and multiple parents, which trees cannot model.
  3. Final Answer:

    Because graphs can represent connections between nodes that trees cannot, like cycles and multiple parents. -> Option A
  4. Quick Check:

    Graphs model cycles and multiple parents [OK]
Hint: Graphs allow cycles and multiple parents; trees do not [OK]
Common Mistakes:
  • Thinking trees can have cycles
  • Confusing memory use with structure capability
  • Assuming graphs only store numbers
2. Which of the following Rust code snippets correctly declares an undirected graph using adjacency lists?
easy
A. let graph: Vec<usize> = vec![0, 1, 2];
B. let graph: Vec = vec![vec![], vec![], vec![]];
C. let graph: HashMap = HashMap::new();
D. let graph: Vec<(usize, usize)> = vec![(0, 1), (1, 2)];

Solution

  1. Step 1: Identify adjacency list structure

    An adjacency list is a vector of vectors where each inner vector holds neighbors of a node.
  2. Step 2: Match code to adjacency list

    let graph: Vec = vec![vec![], vec![], vec![]]; declares a vector of vectors of usize, suitable for adjacency lists.
  3. Final Answer:

    let graph: Vec = vec![vec![], vec![], vec![]]; -> Option B
  4. Quick Check:

    Adjacency list = Vec [OK]
Hint: Adjacency list uses Vec of Vec for neighbors [OK]
Common Mistakes:
  • Using Vec<usize> instead of Vec
  • Using HashMap with wrong types
  • Using edge list instead of adjacency list
3. Consider this Rust code that builds a graph and prints neighbors of node 1:
let mut graph = vec![vec![], vec![], vec![]];
graph[0].push(1);
graph[1].push(0);
graph[1].push(2);
graph[2].push(1);
println!("{:?}", graph[1]);

What is the output?
medium
A. [2]
B. [1, 2]
C. [0, 1]
D. [0, 2]

Solution

  1. Step 1: Trace graph construction

    graph[1] has neighbors pushed: 0 and 2, so graph[1] = [0, 2].
  2. Step 2: Print neighbors of node 1

    Printing graph[1] outputs [0, 2].
  3. Final Answer:

    [0, 2] -> Option D
  4. Quick Check:

    Neighbors of node 1 = [0, 2] [OK]
Hint: Check which neighbors were pushed to node 1's list [OK]
Common Mistakes:
  • Confusing node indices
  • Assuming neighbors include the node itself
  • Mixing order of neighbors
4. This Rust code tries to add an edge to a graph but causes a runtime error:
let mut graph = vec![vec![], vec![]];
graph[0].push(1);
graph[1].push(0);
graph[2].push(1);

What is the error and how to fix it?
medium
A. Index out of bounds error; fix by increasing graph size to include index 2.
B. Type mismatch error; fix by changing Vec to HashMap.
C. Syntax error; fix by adding semicolons.
D. Logic error; fix by removing graph[1].push(0).

Solution

  1. Step 1: Identify cause of runtime error

    graph has length 2, so graph[2] access is out of bounds causing panic.
  2. Step 2: Fix by resizing graph

    Increase graph size to at least 3 elements to allow graph[2].push(1).
  3. Final Answer:

    Index out of bounds error; fix by increasing graph size to include index 2. -> Option A
  4. Quick Check:

    Accessing graph[2] with size 2 causes error [OK]
Hint: Check vector size before indexing [OK]
Common Mistakes:
  • Ignoring vector size limits
  • Confusing syntax and runtime errors
  • Removing unrelated lines
5. You want to model a social network where users can be friends with multiple people and friendships can be mutual or one-way. Why is a graph a better choice than a tree for this model?
hard
A. Because trees can only store numbers, not user data.
B. Because trees are faster to search in social networks.
C. Because graphs allow cycles and multiple connections, representing mutual and one-way friendships.
D. Because graphs use less memory than trees.

Solution

  1. Step 1: Understand social network connections

    Users can have multiple friends, and friendships can be mutual (cycles) or one-way (directed edges).
  2. Step 2: Compare tree and graph capabilities

    Trees cannot represent cycles or multiple parents, but graphs can model these complex relationships.
  3. Step 3: Conclude best data structure

    Graphs are better because they allow cycles and multiple connections needed for social networks.
  4. Final Answer:

    Because graphs allow cycles and multiple connections, representing mutual and one-way friendships. -> Option C
  5. Quick Check:

    Social network needs cycles and multiple edges [OK]
Hint: Social networks need cycles and multiple edges; use graphs [OK]
Common Mistakes:
  • Thinking trees can model mutual friendships
  • Confusing data type storage with structure capability
  • Assuming trees use less memory always
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