📖 Scenario: You are working with a binary tree, a structure like a family tree but with each person having at most two children. You want to see the tree from the top, like looking down from above, so you only see the nodes that are visible without any others blocking them.
🎯 Goal: Build a program that finds the top view of a binary tree. The top view shows the nodes visible when the tree is seen from above, ordered from left to right.
📋 What You'll Learn
Create a binary tree with the exact structure given
Use a variable to track horizontal distances from the root
Implement a function to find the top view of the binary tree
Print the top view nodes in order from left to right
💡 Why This Matters
🌍 Real World
Top view of a binary tree helps in network routing, city planning, and understanding hierarchical data from a unique perspective.
💼 Career
Understanding tree traversals and views is important for software engineers working with data structures, algorithms, and system design.
Progress0 / 4 steps
1
Create the Binary Tree
Create a class called Node with properties data (number), left (Node or null), and right (Node or null). Then create the binary tree with root node root having value 1, left child 2, right child 3, left child of 2 as 4, and right child of 2 as 5.
DSA Typescript
Hint
Think of each Node as a person in a family tree with two children. Create the root first, then add children step by step.
2
Set Up Horizontal Distance Map
Create a Map called topViewMap to store the first node data seen at each horizontal distance from the root. Also create a queue array called queue to hold pairs of Node and their horizontal distance (number). Initialize queue with the root node and horizontal distance 0.
DSA Typescript
Hint
Use a Map to remember the first node at each horizontal distance. Use a queue to explore nodes level by level.
3
Implement Top View Logic
Write a while loop that runs while queue.length > 0. Inside, remove the first element from queue into current. If topViewMap does not have current.hd, set it with current.node.data. Then, if current.node.left exists, add it to queue with horizontal distance current.hd - 1. If current.node.right exists, add it to queue with horizontal distance current.hd + 1.
DSA Typescript
Hint
Use a queue to visit nodes in order. For each horizontal distance, keep only the first node you see.
4
Print the Top View
Create an array sortedKeys from topViewMap.keys() and sort it numerically. Then use a for loop over sortedKeys to print the corresponding node data from topViewMap separated by spaces.
DSA Typescript
Hint
Sort the horizontal distances and print the stored node values in that order separated by spaces.
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 right side
B. Nodes visible when the tree is viewed from the left side
C. Nodes visible when the tree is viewed from above
D. All leaf nodes of the tree
Solution
Step 1: Understand the top view concept
The top view of a binary tree shows nodes visible from the top, ignoring nodes hidden behind others vertically.
Step 2: Compare with other views
Left or right views show nodes from sides, and leaf nodes are only the bottom-most nodes, so they differ from top view.
Final Answer:
Nodes visible when the tree is viewed from above -> Option C
Quick Check:
Top view = nodes seen from above [OK]
Hint: Top view shows nodes visible from above only [OK]
Common Mistakes:
Confusing top view with left or right view
Thinking top view includes all leaf nodes
Assuming top view shows all nodes
2. Which TypeScript data structure is best suited to store nodes with their horizontal distances while computing the top view of a binary tree?
easy
A. Map (key-value pairs)
B. Array
C. Set
D. Stack
Solution
Step 1: Identify the need for key-value storage
We need to store nodes with their horizontal distances as keys and node values as values.
Step 2: Choose the appropriate data structure
A Map allows storing keys (horizontal distances) with corresponding node values efficiently.
Final Answer:
Map (key-value pairs) -> Option A
Quick Check:
Use Map for horizontal distance to node mapping [OK]
Hint: Use Map to link horizontal distance and node [OK]
Common Mistakes:
Using Array which is index-based, not key-based
Using Set which stores unique values without keys
Using Stack which is LIFO, not suitable here
3. Given the following TypeScript code snippet for top view, what will be the printed output?
class Node {
constructor(public data: number, public left: Node | null = null, public right: Node | null = null) {}
}
const root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.right = new Node(4);
root.left.right.right = new Node(5);
root.left.right.right.right = new Node(6);
function topView(root: Node) {
const map = new Map();
const queue: Array<[Node, number]> = [[root, 0]];
while (queue.length) {
const [node, hd] = queue.shift()!;
if (!map.has(hd)) {
map.set(hd, node.data);
}
if (node.left) queue.push([node.left, hd - 1]);
if (node.right) queue.push([node.right, hd + 1]);
}
const sortedKeys = Array.from(map.keys()).sort((a, b) => a - b);
const result = sortedKeys.map(key => map.get(key));
console.log(result);
}
topView(root);
medium
A. [1, 2, 3, 4, 5, 6]
B. [2, 4, 1, 3, 6]
C. [2, 1, 3]
D. [2, 1, 3, 6]
Solution
Step 1: Assign horizontal distances and track first nodes
Root(1) at hd=0, left(2) at hd=-1, right(3) at hd=1. Next nodes 4 at hd=0 (ignored, already 1), 5 at hd=1 (ignored, already 3), 6 at hd=2 (new).
Step 2: Collect nodes in order of horizontal distance
Hint: First node at each horizontal distance is in top view [OK]
Common Mistakes:
Including nodes hidden behind others at same horizontal distance
Not sorting horizontal distances before output
Adding all nodes instead of first at each horizontal distance
4. Identify the bug in the following TypeScript code for top view of a binary tree:
function topView(root: Node) {
const map = new Map();
const queue: Array<[Node, number]> = [[root, 0]];
while (queue.length) {
const [node, hd] = queue.pop()!;
if (!map.has(hd)) {
map.set(hd, node.data);
}
if (node.left) queue.push([node.left, hd - 1]);
if (node.right) queue.push([node.right, hd + 1]);
}
const sortedKeys = Array.from(map.keys()).sort((a, b) => a - b);
const result = sortedKeys.map(key => map.get(key));
console.log(result);
}
medium
A. Using queue.pop() instead of queue.shift() causes wrong traversal order
B. Not checking if root is null before processing
C. Not sorting the keys before printing result
D. Using Map instead of Set for horizontal distances
Solution
Step 1: Analyze queue operation impact
Using pop() removes from end, making traversal depth-first instead of breadth-first, breaking horizontal distance order.
Step 2: Correct traversal method
Using shift() removes from front, ensuring level order traversal needed for correct top view.
Final Answer:
Using queue.pop() instead of queue.shift() causes wrong traversal order -> Option A
Quick Check:
Use shift() for BFS queue [OK]
Hint: Use shift() for BFS queue, not pop() [OK]
Common Mistakes:
Using pop() causing DFS instead of BFS
Ignoring null root check (less critical here)
Not sorting keys before output (code does sort)
5. You have a binary tree where multiple nodes share the same horizontal distance and level. How should you modify the top view algorithm to always show the node with the smallest value at each horizontal distance?
hard
A. Store all nodes at each horizontal distance and pick the last inserted node
B. Update the map only if the new node's value is smaller than the existing one at that horizontal distance
C. Ignore horizontal distance and print nodes in level order
D. Use a stack instead of a queue for traversal
Solution
Step 1: Understand the problem with duplicates
When nodes share horizontal distance and level, default top view picks first encountered node, not necessarily smallest value.
Step 2: Modify map update condition
Update the map only if the new node's value is smaller than the stored value for that horizontal distance to ensure smallest value is shown.
Final Answer:
Update the map only if the new node's value is smaller than the existing one at that horizontal distance -> Option B
Quick Check:
Keep smallest node value per horizontal distance [OK]
Hint: Update map only if new node value is smaller [OK]
Common Mistakes:
Ignoring value comparison, keeping first node only
Using stack breaks level order needed
Storing all nodes wastes memory and complicates logic
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.