Bird
Raised Fist0
DSA Rustprogramming~20 mins

Top View of Binary Tree in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Top View Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Top View for a Simple Binary Tree
What is the printed top view of the binary tree after running the given Rust code?
DSA Rust
use std::collections::{HashMap, VecDeque};

#[derive(Debug)]
struct Node {
    val: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

impl Node {
    fn new(val: i32) -> Self {
        Node { val, left: None, right: None }
    }
}

fn top_view(root: &Option<Box<Node>>) -> Vec<i32> {
    if root.is_none() {
        return vec![];
    }
    let mut queue = VecDeque::new();
    let mut hd_map = HashMap::new();
    queue.push_back((root.as_ref(), 0));

    while let Some((node_opt, hd)) = queue.pop_front() {
        if let Some(node) = node_opt {
            hd_map.entry(hd).or_insert(node.val);
            if node.left.is_some() {
                queue.push_back((node.left.as_ref(), hd - 1));
            }
            if node.right.is_some() {
                queue.push_back((node.right.as_ref(), hd + 1));
            }
        }
    }

    let mut keys: Vec<_> = hd_map.keys().cloned().collect();
    keys.sort();
    keys.iter().map(|k| *hd_map[k]).collect()
}

fn main() {
    let mut root = Box::new(Node::new(1));
    root.left = Some(Box::new(Node::new(2)));
    root.right = Some(Box::new(Node::new(3)));
    root.left.as_mut().unwrap().right = Some(Box::new(Node::new(4)));
    root.left.as_mut().unwrap().right.as_mut().unwrap().right = Some(Box::new(Node::new(5)));
    root.left.as_mut().unwrap().right.as_mut().unwrap().right.as_mut().unwrap().right = Some(Box::new(Node::new(6)));

    let result = top_view(&Some(root));
    for val in result {
        print!("{} ", val);
    }
}
A1 2 3 6
B2 4 1 3 6
C2 1 3 6
D1 2 3 4 5 6
Attempts:
2 left
💡 Hint
Think about horizontal distances and which nodes appear first at each horizontal distance.
❓ Predict Output
intermediate
2:00remaining
Top View Output for a Balanced Binary Tree
What is the output of the top view function for the following balanced binary tree?
DSA Rust
use std::collections::{HashMap, VecDeque};

#[derive(Debug)]
struct Node {
    val: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

impl Node {
    fn new(val: i32) -> Self {
        Node { val, left: None, right: None }
    }
}

fn top_view(root: &Option<Box<Node>>) -> Vec<i32> {
    if root.is_none() {
        return vec![];
    }
    let mut queue = VecDeque::new();
    let mut hd_map = HashMap::new();
    queue.push_back((root.as_ref(), 0));

    while let Some((node_opt, hd)) = queue.pop_front() {
        if let Some(node) = node_opt {
            hd_map.entry(hd).or_insert(node.val);
            if node.left.is_some() {
                queue.push_back((node.left.as_ref(), hd - 1));
            }
            if node.right.is_some() {
                queue.push_back((node.right.as_ref(), hd + 1));
            }
        }
    }

    let mut keys: Vec<_> = hd_map.keys().cloned().collect();
    keys.sort();
    keys.iter().map(|k| *hd_map[k]).collect()
}

fn main() {
    let mut root = Box::new(Node::new(10));
    root.left = Some(Box::new(Node::new(20)));
    root.right = Some(Box::new(Node::new(30)));
    root.left.as_mut().unwrap().left = Some(Box::new(Node::new(40)));
    root.left.as_mut().unwrap().right = Some(Box::new(Node::new(50)));
    root.right.as_mut().unwrap().left = Some(Box::new(Node::new(60)));
    root.right.as_mut().unwrap().right = Some(Box::new(Node::new(70)));

    let result = top_view(&Some(root));
    for val in result {
        print!("{} ", val);
    }
}
A40 20 10 30 70
B40 20 10 30 60 70
C20 10 30
D10 20 30 40 50 60 70
Attempts:
2 left
💡 Hint
Only the first node at each horizontal distance is printed.
🔧 Debug
advanced
2:00remaining
Identify the Error in Top View Implementation
The following Rust code attempts to print the top view of a binary tree but produces incorrect output. What is the main logical error?
DSA Rust
use std::collections::{HashMap, VecDeque};

#[derive(Debug)]
struct Node {
    val: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

impl Node {
    fn new(val: i32) -> Self {
        Node { val, left: None, right: None }
    }
}

fn top_view(root: &Option<Box<Node>>) -> Vec<i32> {
    if root.is_none() {
        return vec![];
    }
    let mut queue = VecDeque::new();
    let mut hd_map = HashMap::new();
    queue.push_back((root.as_ref(), 0));

    while let Some((node_opt, hd)) = queue.pop_front() {
        if let Some(node) = node_opt {
            hd_map.insert(hd, node.val); // <-- Problem here
            if node.left.is_some() {
                queue.push_back((node.left.as_ref(), hd - 1));
            }
            if node.right.is_some() {
                queue.push_back((node.right.as_ref(), hd + 1));
            }
        }
    }

    let mut keys: Vec<_> = hd_map.keys().cloned().collect();
    keys.sort();
    keys.iter().map(|k| *hd_map[k]).collect()
}
AUsing hd_map.insert overwrites earlier nodes at the same horizontal distance, losing the top view nodes.
BThe queue is not initialized properly, causing panic at runtime.
CThe horizontal distance is not updated correctly when traversing left and right children.
DThe function does not handle empty trees and will panic if root is None.
Attempts:
2 left
💡 Hint
Consider how the first node at each horizontal distance should be preserved.
🧠 Conceptual
advanced
1:30remaining
Horizontal Distance Concept in Top View
In the context of the top view of a binary tree, what does the 'horizontal distance' (HD) represent?
AThe vertical level of a node from the root, starting at 0 for the root.
BThe relative horizontal position of a node from the root, where left child decreases HD by 1 and right child increases HD by 1.
CThe distance of a node from the root measured along the edges.
DThe depth of a node in the tree, counting edges from the root.
Attempts:
2 left
💡 Hint
Think about how left and right children affect horizontal position.
🚀 Application
expert
3:00remaining
Top View Output for Complex Tree with Overlapping Nodes
Given the following binary tree structure, what is the top view output printed by the Rust code?
DSA Rust
use std::collections::{HashMap, VecDeque};

#[derive(Debug)]
struct Node {
    val: i32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

impl Node {
    fn new(val: i32) -> Self {
        Node { val, left: None, right: None }
    }
}

fn top_view(root: &Option<Box<Node>>) -> Vec<i32> {
    if root.is_none() {
        return vec![];
    }
    let mut queue = VecDeque::new();
    let mut hd_map = HashMap::new();
    queue.push_back((root.as_ref(), 0));

    while let Some((node_opt, hd)) = queue.pop_front() {
        if let Some(node) = node_opt {
            hd_map.entry(hd).or_insert(node.val);
            if node.left.is_some() {
                queue.push_back((node.left.as_ref(), hd - 1));
            }
            if node.right.is_some() {
                queue.push_back((node.right.as_ref(), hd + 1));
            }
        }
    }

    let mut keys: Vec<_> = hd_map.keys().cloned().collect();
    keys.sort();
    keys.iter().map(|k| *hd_map[k]).collect()
}

fn main() {
    let mut root = Box::new(Node::new(1));
    root.left = Some(Box::new(Node::new(2)));
    root.right = Some(Box::new(Node::new(3)));
    root.left.as_mut().unwrap().left = Some(Box::new(Node::new(4)));
    root.left.as_mut().unwrap().right = Some(Box::new(Node::new(5)));
    root.right.as_mut().unwrap().left = Some(Box::new(Node::new(6)));
    root.right.as_mut().unwrap().right = Some(Box::new(Node::new(7)));
    root.left.as_mut().unwrap().right.as_mut().unwrap().left = Some(Box::new(Node::new(8)));
    root.left.as_mut().unwrap().right.as_mut().unwrap().right = Some(Box::new(Node::new(9)));

    let result = top_view(&Some(root));
    for val in result {
        print!("{} ", val);
    }
}
A4 2 1 6 3 7
B4 2 1 3 7 9
C4 2 5 1 3 7
D4 2 1 3 7
Attempts:
2 left
💡 Hint
Remember only the first node at each horizontal distance is included in the top view.

Practice

(1/5)
1. What does the top view of a binary tree represent?
easy
A. Nodes visible when the tree is viewed from the top
B. Nodes visible when the tree is viewed from the left side
C. Nodes visible when the tree is viewed from the bottom
D. Nodes visible when the tree is viewed from the right side

Solution

  1. Step 1: Understand the top view concept

    The top view of a binary tree shows all nodes that are visible when looking down vertically from above the tree.
  2. Step 2: Compare with other views

    Left, right, and bottom views show nodes visible from those sides, not from the top.
  3. Final Answer:

    Nodes visible when the tree is viewed from the top -> Option A
  4. Quick Check:

    Top view = nodes seen from above [OK]
Hint: Top view shows nodes visible from above the tree [OK]
Common Mistakes:
  • Confusing top view with left or right view
  • Thinking bottom view is the same as top view
2. Which Rust data structure is best suited to store nodes with their horizontal distances for computing the top view of a binary tree?
easy
A. HashMap
B. Vec<Node>
C. LinkedList<Node>
D. BinaryHeap<Node>

Solution

  1. Step 1: Identify the need for horizontal distance mapping

    Top view requires tracking nodes by their horizontal distance from the root, which can be negative or positive integers.
  2. Step 2: Choose a data structure for key-value mapping

    A HashMap with key as horizontal distance (i32) and value as Node is ideal for quick lookups and updates.
  3. Final Answer:

    HashMap -> Option A
  4. Quick Check:

    Use HashMap for horizontal distance mapping [OK]
Hint: Use HashMap to map horizontal distance to nodes [OK]
Common Mistakes:
  • Using Vec which doesn't map keys to values
  • Using LinkedList which is inefficient for lookups
  • Using BinaryHeap which is for priority queues
3. Given the following Rust code snippet for top view traversal, what will be printed?
struct Node {
    val: i32,
    left: Option,
    right: Option,
}

// Tree:
//       1
//      / \
//     2   3
//      \   \
//       4   5

fn main() {
    let root = Node {
        val: 1,
        left: Some(Box::new(Node {
            val: 2,
            left: None,
            right: Some(Box::new(Node { val: 4, left: None, right: None })),
        })),
        right: Some(Box::new(Node {
            val: 3,
            left: None,
            right: Some(Box::new(Node { val: 5, left: None, right: None })),
        })),
    };
    // Assume top_view function prints top view nodes in order from left to right
    top_view(&root);
}
medium
A. [2, 4, 1, 3, 5]
B. [2, 1, 3, 5]
C. [4, 2, 1, 3, 5]
D. [1, 2, 3]

Solution

  1. Step 1: Assign horizontal distances to nodes

    Root (1) is at 0, left child (2) at -1, right child (3) at +1, node 4 at 0 (right child of 2), node 5 at +2 (right child of 3).
  2. Step 2: Determine top view nodes by horizontal distance

    For each horizontal distance, the first node encountered from top is chosen: -1: 2, 0: 1, +1: 3, +2: 5. Node 4 at 0 is below 1, so ignored.
  3. Final Answer:

    [2, 1, 3, 5] -> Option B
  4. Quick Check:

    Top view nodes by horizontal distance = [2, 1, 3, 5] [OK]
Hint: Pick first node at each horizontal distance from top [OK]
Common Mistakes:
  • Including nodes below first at same horizontal distance
  • Ignoring horizontal distances for nodes
  • Confusing order of output
4. The following Rust code attempts to compute the top view of a binary tree but has a bug. What is the error?
fn top_view(root: &Node) {
    let mut map = std::collections::HashMap::new();
    let mut queue = std::collections::VecDeque::new();
    queue.push_back((root, 0));

    while let Some((node, hd)) = queue.pop_front() {
        // Insert node if horizontal distance not present
        map.entry(hd).or_insert(node.val);

        if let Some(left) = &node.left {
            queue.push_back((left, hd - 1));
        }
        if let Some(right) = &node.right {
            queue.push_back((right, hd + 1));
        }
    }

    for key in map.keys() {
        println!("{}", map[key]);
    }
}
medium
A. The code inserts duplicate nodes for same horizontal distance
B. The queue is not initialized properly
C. The map keys are not sorted before printing, so output order is random
D. The code does not handle empty tree (root is None)

Solution

  1. Step 1: Analyze map insertion and printing

    The code inserts nodes correctly using or_insert to keep first node per horizontal distance.
  2. Step 2: Check output order

    HashMap keys are unordered, so iterating with map.keys() prints nodes in random order, not left to right.
  3. Final Answer:

    The map keys are not sorted before printing, so output order is random -> Option C
  4. Quick Check:

    Sort keys before printing top view [OK]
Hint: Sort horizontal distances before printing top view [OK]
Common Mistakes:
  • Assuming HashMap keys are ordered
  • Ignoring empty tree case (not asked here)
  • Thinking queue initialization is wrong
5. You want to find the top view of a binary tree but only have the tree nodes and no horizontal distance stored. Which approach correctly computes the top view in Rust? A) Use a recursive function passing horizontal distance and level, store first node per horizontal distance with smallest level. B) Use a stack to traverse nodes and store last node per horizontal distance. C) Traverse the tree in preorder and print nodes as you visit. D) Use a queue but ignore horizontal distances and print nodes in insertion order.
hard
A. Preorder traversal printing nodes directly
B. Use stack and store last node per horizontal distance
C. Use queue ignoring horizontal distances
D. Use recursion with horizontal distance and level to track top nodes

Solution

  1. Step 1: Understand top view requires horizontal distance and level

    Top view needs to know horizontal distance and the vertical level to pick the topmost node at each horizontal distance.
  2. Step 2: Choose approach that tracks horizontal distance and level

    Recursive traversal passing horizontal distance and level, storing first node per horizontal distance with smallest level, correctly computes top view.
  3. Final Answer:

    Use recursion with horizontal distance and level to track top nodes -> Option D
  4. Quick Check:

    Track horizontal distance and level recursively [OK]
Hint: Track horizontal distance and level to find top nodes [OK]
Common Mistakes:
  • Ignoring horizontal distance in traversal
  • Using stack without tracking levels
  • Printing nodes in preorder without filtering
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