Bird
Raised Fist0
DSA Rustprogramming~20 mins

Tree Traversal Inorder Left Root Right in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Inorder Traversal Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of inorder traversal on this binary tree?

Consider the following binary tree structure and the inorder traversal function. What will be printed?

DSA Rust
struct Node {
    val: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

fn inorder(root: &Option<Box<Node>>, result: &mut Vec<i32>) {
    if let Some(node) = root {
        inorder(&node.left, result);
        result.push(node.val);
        inorder(&node.right, result);
    }
}

fn main() {
    let tree = Some(Box::new(Node {
        val: 2,
        left: Some(Box::new(Node {
            val: 1,
            left: None,
            right: None,
        })),
        right: Some(Box::new(Node {
            val: 3,
            left: None,
            right: None,
        })),
    }));
    let mut result = Vec::new();
    inorder(&tree, &mut result);
    println!("{:?}", result);
}
A[3, 2, 1]
B[2, 1, 3]
C[1, 2, 3]
D[1, 3, 2]
Attempts:
2 left
💡 Hint

Inorder traversal visits left child, then root, then right child.

❓ Predict Output
intermediate
2:00remaining
What is the inorder traversal output of this unbalanced tree?

Given the following tree and inorder traversal function, what is the output?

DSA Rust
struct Node {
    val: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

fn inorder(root: &Option<Box<Node>>, result: &mut Vec<i32>) {
    if let Some(node) = root {
        inorder(&node.left, result);
        result.push(node.val);
        inorder(&node.right, result);
    }
}

fn main() {
    let tree = Some(Box::new(Node {
        val: 5,
        left: Some(Box::new(Node {
            val: 3,
            left: Some(Box::new(Node {
                val: 2,
                left: None,
                right: None,
            })),
            right: None,
        })),
        right: Some(Box::new(Node {
            val: 7,
            left: None,
            right: Some(Box::new(Node {
                val: 8,
                left: None,
                right: None,
            })),
        })),
    }));
    let mut result = Vec::new();
    inorder(&tree, &mut result);
    println!("{:?}", result);
}
A[5, 3, 2, 7, 8]
B[2, 3, 5, 7, 8]
C[3, 2, 5, 8, 7]
D[2, 5, 3, 7, 8]
Attempts:
2 left
💡 Hint

Remember inorder visits left subtree, root, then right subtree recursively.

🔧 Debug
advanced
2:00remaining
Why does this inorder traversal code cause a stack overflow?

Examine the code below. It is intended to perform inorder traversal but causes a stack overflow error. What is the cause?

DSA Rust
struct Node {
    val: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

fn inorder(root: &Option<Box<Node>>, result: &mut Vec<i32>) {
    if let Some(node) = root {
        inorder(&node.left, result);
        result.push(node.val);
        inorder(&node.left, result); // mistake here
    }
}

fn main() {
    let tree = Some(Box::new(Node {
        val: 1,
        left: None,
        right: None,
    }));
    let mut result = Vec::new();
    inorder(&tree, &mut result);
    println!("{:?}", result);
}
AThe function calls inorder on node.left twice, missing node.right, causing infinite recursion.
BThe function does not check if node is None before recursion, causing panic.
CThe result vector is not mutable, causing a compile error.
DThe Node struct is missing a parent pointer, causing stack overflow.
Attempts:
2 left
💡 Hint

Check the recursive calls carefully for repeated calls on the same child.

🧠 Conceptual
advanced
1:30remaining
Which property does inorder traversal guarantee on a binary search tree (BST)?

In a binary search tree, what does the inorder traversal output represent?

AThe nodes visited in ascending sorted order.
BThe nodes visited in descending sorted order.
CThe nodes visited in random order depending on tree shape.
DThe nodes visited level by level from top to bottom.
Attempts:
2 left
💡 Hint

Recall the BST property: left child < root < right child.

🚀 Application
expert
1:30remaining
How many nodes are visited in inorder traversal of this tree?

Given the tree below, how many nodes will the inorder traversal visit?

Tree structure:

  • Root: 10
  • Left child: 5 (with left child 3 and right child 7)
  • Right child: 15 (with right child 18)
A4
B5
C3
D6
Attempts:
2 left
💡 Hint

Count all nodes in the tree; inorder visits all nodes exactly once.

Practice

(1/5)
1. What is the order of nodes visited in an inorder traversal of a binary tree?
easy
A. Left subtree, Root node, Right subtree
B. Root node, Left subtree, Right subtree
C. Right subtree, Root node, Left subtree
D. Root node, Right subtree, Left subtree

Solution

  1. Step 1: Understand inorder traversal definition

    Inorder traversal visits nodes in the order: left subtree first, then the root node, and finally the right subtree.
  2. Step 2: Match the order with options

    Left subtree, Root node, Right subtree matches the left-root-right order exactly.
  3. Final Answer:

    Left subtree, Root node, Right subtree -> Option A
  4. Quick Check:

    Inorder = Left, Root, Right [OK]
Hint: Remember: Inorder means Left, Root, then Right [OK]
Common Mistakes:
  • Confusing inorder with preorder or postorder
  • Mixing up the order of root and subtrees
  • Thinking inorder visits root first
2. Which Rust code snippet correctly implements the inorder traversal function signature for a binary tree node?
easy
A. fn inorder(node: Box<TreeNode>) -> Vec<i32> { /* traversal code */ }
B. fn inorder(node: &Option) { /* traversal code */ }
C. fn inorder(node: &TreeNode) -> Vec<i32> { /* traversal code */ }
D. fn inorder(node: Option<TreeNode>) { /* traversal code */ }

Solution

  1. Step 1: Understand Rust ownership and references for trees

    Binary trees in Rust often use Option to allow null and heap allocation. Passing by reference (&Option) avoids ownership transfer during traversal.
  2. Step 2: Check each option's signature

    fn inorder(node: &Option) { /* traversal code */ } uses a reference to Option, which is correct for traversal without ownership moves. Others either take ownership or incorrect types.
  3. Final Answer:

    fn inorder(node: &Option) { /* traversal code */ } -> Option B
  4. Quick Check:

    Use &Option for safe traversal [OK]
Hint: Use references to Option for traversal [OK]
Common Mistakes:
  • Taking ownership of nodes causing move errors
  • Using plain TreeNode instead of Box or Option
  • Returning traversal result without proper ownership
3. Given the following Rust code for inorder traversal, what is the printed output?
struct TreeNode {
    val: i32,
    left: Option,
    right: Option,
}

fn inorder(node: &Option) {
    if let Some(n) = node {
        inorder(&n.left);
        print!("{} ", n.val);
        inorder(&n.right);
    }
}

fn main() {
    let tree = Some(Box::new(TreeNode {
        val: 2,
        left: Some(Box::new(TreeNode {
            val: 1,
            left: None,
            right: None,
        })),
        right: Some(Box::new(TreeNode {
            val: 3,
            left: None,
            right: None,
        })),
    }));
    inorder(&tree);
}
medium
A. 3 2 1
B. 2 1 3
C. 1 2 3
D. 1 3 2

Solution

  1. Step 1: Understand the tree structure

    The root node has value 2, left child 1, right child 3.
  2. Step 2: Trace inorder traversal

    Inorder visits left subtree (1), then root (2), then right subtree (3). So output is "1 2 3 "
  3. Final Answer:

    1 2 3 -> Option C
  4. Quick Check:

    Inorder prints left-root-right: 1 2 3 [OK]
Hint: Inorder prints left child, root, then right child [OK]
Common Mistakes:
  • Printing root before left subtree
  • Confusing preorder or postorder output
  • Ignoring spaces in output
4. Identify the error in this Rust inorder traversal code and select the fix:
fn inorder(node: Option) {
    if let Some(n) = node {
        inorder(n.left);
        print!("{} ", n.val);
        inorder(n.right);
    }
}
medium
A. No error, code is correct
B. Change parameter to Option<&Box<TreeNode>> and call inorder(n.left) and inorder(n.right)
C. Add return type Vec<i32> and collect values instead of printing
D. Change parameter to &Option and call inorder(&n.left) and inorder(&n.right)

Solution

  1. Step 1: Identify ownership problem in parameter

    The function takes ownership of node, so recursive calls move ownership of n.left and n.right, which is invalid after first call.
  2. Step 2: Fix by using references

    Changing parameter to &Option and calling inorder(&n.left) and inorder(&n.right) avoids ownership moves and allows safe recursion.
  3. Final Answer:

    Change parameter to &Option and call inorder(&n.left) and inorder(&n.right) -> Option D
  4. Quick Check:

    Use references to avoid ownership moves in recursion [OK]
Hint: Use references in recursive tree traversal to avoid ownership errors [OK]
Common Mistakes:
  • Passing ownership causing move errors
  • Trying to use Option<&Box<TreeNode>> incorrectly
  • Ignoring Rust's ownership rules in recursion
5. You want to collect all values of a binary tree in inorder traversal into a vector in Rust. Which code snippet correctly implements this?
hard
A. fn inorder_collect(node: &Option) -> Vec<i32> { let mut vals = Vec::new(); if let Some(n) = node { vals.extend(inorder_collect(&n.left)); vals.push(n.val); vals.extend(inorder_collect(&n.right)); } vals }
B. fn inorder_collect(node: Option) -> Vec<i32> { let mut vals = Vec::new(); if let Some(n) = node { vals.push(n.val); vals.extend(inorder_collect(n.left)); vals.extend(inorder_collect(n.right)); } vals }
C. fn inorder_collect(node: &Option, vals: &mut Vec<i32>) { if let Some(n) = node { vals.push(n.val); inorder_collect(&n.left, vals); inorder_collect(&n.right, vals); } }
D. fn inorder_collect(node: &Option) -> Vec<i32> { let mut vals = Vec::new(); if let Some(n) = node { vals.push(n.val); vals.extend(inorder_collect(&n.right)); vals.extend(inorder_collect(&n.left)); } vals }

Solution

  1. Step 1: Understand inorder traversal collection

    Inorder means collect left subtree values first, then root value, then right subtree values.
  2. Step 2: Check each code snippet's order and ownership

    fn inorder_collect(node: &Option) -> Vec<i32> { let mut vals = Vec::new(); if let Some(n) = node { vals.extend(inorder_collect(&n.left)); vals.push(n.val); vals.extend(inorder_collect(&n.right)); } vals } correctly uses references, collects left subtree, then root, then right subtree, returning combined vector.
  3. Final Answer:

    fn inorder_collect(node: &Option) -> Vec<i32> { let mut vals = Vec::new(); if let Some(n) = node { vals.extend(inorder_collect(&n.left)); vals.push(n.val); vals.extend(inorder_collect(&n.right)); } vals } -> Option A
  4. Quick Check:

    Collect left, root, right in vector [OK]
Hint: Collect left subtree, then root, then right subtree values [OK]
Common Mistakes:
  • Wrong order of pushing values
  • Taking ownership instead of references
  • Appending right subtree before left
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