📖 Scenario: Imagine you are working with a tree of buildings in a city. You want to see which buildings are visible when looking from the top. This means you want to find the top view of a binary tree, where each node represents a building.
🎯 Goal: Build a program that finds and prints the top view of a binary tree. The top view shows the nodes visible when the tree is viewed from above, from left to right.
📋 What You'll Learn
Create a binary tree node structure with integer data and left and right pointers
Build a sample binary tree with given nodes
Use a map to track the first node at each horizontal distance from the root
Traverse the tree using level order traversal to find the top view
Print the top view nodes from leftmost to rightmost horizontal distance
💡 Why This Matters
🌍 Real World
Top view of a binary tree helps in understanding visibility problems like city skyline or network coverage from above.
💼 Career
Understanding tree traversals and views is important for software roles involving data structures, graphics, and spatial data processing.
Progress0 / 4 steps
1
Create the Binary Tree Node Structure and Sample Tree
Create a struct called Node with an int data, and two pointers Node* left and Node* right. Then create a binary tree with root node value 1, root's left child 2, root's right child 3, left child's left child 4, and left child's right child 5.
DSA C++
Hint
Define a struct with data and pointers. Then create nodes using new Node(value) and link them.
2
Add a Map to Track Horizontal Distances
Include the map and queue headers. Declare a map<int, int> topViewMap to store the first node data at each horizontal distance. Also, declare a queue<pair<Node*, int>> q to perform level order traversal with horizontal distances.
DSA C++
Hint
Use map to store horizontal distance and node data. Use queue for level order traversal.
3
Implement Level Order Traversal to Find Top View
Push the root node with horizontal distance 0 into the queue. While the queue is not empty, pop the front node and horizontal distance. If the horizontal distance is not in topViewMap, insert the node's data. Then push the left child with horizontal distance minus 1 and right child with horizontal distance plus 1 if they exist.
DSA C++
Hint
Use a queue to do level order traversal. Track horizontal distance and store first node at each distance.
4
Print the Top View from Left to Right
Use a for loop to iterate over topViewMap and print each node's data separated by spaces.
DSA C++
Hint
Iterate over the map which is sorted by horizontal distance and print the node values.
Practice
(1/5)
1. What does the top view of a binary tree represent?
easy
A. All leaf nodes of the tree
B. Nodes visible when the tree is viewed from the left side
C. Nodes visible when the tree is viewed from the right side
D. Nodes visible when the tree is viewed from above
Solution
Step 1: Understand the meaning of top view
The top view of a binary tree shows nodes that are visible when looking down vertically from above the tree.
Step 2: Compare with other views
Left or right views show nodes visible from sides, and leaf nodes are only the bottom nodes, so they are different.
Final Answer:
Nodes visible when the tree is viewed from above -> Option D
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 shows all leaf nodes
Assuming top view includes hidden nodes
2. Which C++ STL container is best suited to store nodes by their horizontal distance for top view calculation?
easy
A. std::map
B. std::stack
C. std::vector
D. std::queue
Solution
Step 1: Identify the need for horizontal distance mapping
Top view requires storing nodes by their horizontal distance from root, which can be negative or positive keys.
Step 2: Choose container supporting key-value pairs with sorted keys
std::map stores keys in sorted order and allows negative keys, unlike vector which uses indices starting at 0.
Final Answer:
std::map -> Option A
Quick Check:
Use map for horizontal distance keys [OK]
Hint: Use map to store nodes by horizontal distance [OK]
Common Mistakes:
Using vector which can't handle negative keys
Using stack or queue which don't map keys
Not sorting nodes by horizontal distance
3. What is the output of the top view for the following binary tree?
1
/ \
2 3
\ \
4 5
\ \
6 7
medium
A. [2, 1, 3, 5, 7]
B. [2, 1, 4, 6, 7]
C. [2, 1, 3, 4, 5]
D. [1, 2, 3, 4, 5, 6, 7]
Solution
Step 1: Assign horizontal distances (HD) to nodes
Root 1 has HD=0; left child 2 is HD=-1; right child 3 is HD=1; 4 is right of 2 so HD=0; 5 is right of 3 so HD=2; 6 is right of 4 so HD=1; 7 is right of 5 so HD=3.
Step 2: Select first node at each HD from top to bottom
HD=-1: 2; HD=0: 1; HD=1: 3; HD=2: 5; HD=3: 7. Nodes 4 and 6 are hidden behind 1 and 3 respectively.
Final Answer:
[2, 1, 3, 5, 7] -> Option A
Quick Check:
Top view nodes by HD = [2,1,3,5,7] [OK]
Hint: Pick first node at each horizontal distance [OK]
Common Mistakes:
Including nodes hidden behind others at same HD
Mixing order of nodes in output
Ignoring horizontal distance calculation
4. Identify the error in this C++ snippet for top view calculation:
std::map topViewMap;
std::queue> q;
q.push({root, 0});
while(!q.empty()) {
auto p = q.front(); q.pop();
Node* node = p.first;
int hd = p.second;
if(topViewMap.find(hd) == topViewMap.end())
topViewMap[hd] = node->data;
if(node->left) q.push({node->left, hd - 1});
if(node->right) q.push({node->right, hd + 1});
}
medium
A. Using std::map instead of unordered_map causes slower lookup
B. Incorrect horizontal distance update for left and right children
C. Not checking if node is nullptr before accessing node->left and node->right
D. Not clearing the queue before starting the loop
Solution
Step 1: Check node pointer usage inside loop
The code accesses node->left and node->right without verifying if node is nullptr, which can cause runtime errors if node is null.
Step 2: Verify other parts of code
Horizontal distances are updated correctly; queue is initialized properly; map choice is valid though unordered_map could be faster but not an error.
Final Answer:
Not checking if node is nullptr before accessing node->left and node->right -> Option C
Quick Check:
Always check node != nullptr before child access [OK]
Hint: Check node pointer before accessing children [OK]
Common Mistakes:
Ignoring nullptr checks causing crashes
Confusing horizontal distance updates
Assuming map choice causes errors
5. Given a binary tree where multiple nodes share the same horizontal distance and level, which node should appear in the top view?
hard
A. The node with the maximum value at that horizontal distance
B. The node that appears first in level order traversal at that horizontal distance
C. The node that appears last in level order traversal at that horizontal distance
D. The leftmost node at that horizontal distance regardless of level
Solution
Step 1: Understand top view node selection criteria
Top view shows the first node encountered at each horizontal distance when traversing level by level (top to bottom, left to right).
Step 2: Clarify why first node in level order is chosen
Because level order visits nodes by increasing depth, the first node at a horizontal distance is the topmost visible node.
Final Answer:
The node that appears first in level order traversal at that horizontal distance -> Option B
Quick Check:
Top view = first node per horizontal distance in level order [OK]
Hint: Pick first node at horizontal distance in level order [OK]
Common Mistakes:
Choosing node by max value instead of position
Picking last node instead of first in level order
Ignoring level order traversal importance
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.