Top View of Binary Tree in DSA Python - Time & Space Complexity
We want to understand how the time needed to find the top view of a binary tree changes as the tree grows.
Specifically, how does the number of nodes affect the work done?
Analyze the time complexity of the following code snippet.
from collections import deque
def top_view(root):
if not root:
return []
queue = deque([(root, 0)])
top_nodes = {}
while queue:
node, hd = queue.popleft()
if hd not in top_nodes:
top_nodes[hd] = node.val
if node.left:
queue.append((node.left, hd - 1))
if node.right:
queue.append((node.right, hd + 1))
return [top_nodes[hd] for hd in sorted(top_nodes)]
This code finds the top view of a binary tree by visiting nodes level by level and tracking their horizontal distances.
- Primary operation: The while loop that visits each node once.
- How many times: Exactly once per node in the tree (n times).
As the number of nodes (n) increases, the code visits each node once, so the work grows directly with n.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 visits and checks |
| 100 | About 100 visits and checks |
| 1000 | About 1000 visits and checks |
Pattern observation: The operations increase in a straight line as the tree grows.
Time Complexity: O(n)
This means the time to find the top view grows directly with the number of nodes in the tree.
[X] Wrong: "The code visits nodes multiple times, so it must be slower than O(n)."
[OK] Correct: Each node is visited exactly once in the queue, so the total work is proportional to the number of nodes.
Understanding this helps you explain how tree traversals work efficiently and how to track extra information like horizontal distance.
"What if we used a recursive approach instead of a queue? How would the time complexity change?"
Practice
top view of a binary tree represent?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 DQuick Check:
Top view = nodes seen from above [OK]
- Confusing top view with left or right view
- Thinking top view shows all leaf nodes
- Assuming top view includes all nodes
Solution
Step 1: Identify the need for key-value mapping
We need to map horizontal distances (keys) to nodes (values) to track the first node at each horizontal distance.Step 2: Choose the appropriate data structure
Dictionaries provide key-value pairs, allowing efficient lookup and insertion by horizontal distance.Final Answer:
Dictionary -> Option CQuick Check:
Use dictionary for horizontal distance mapping [OK]
- Using list which is index-based, not key-based
- Using set which stores unique values without keys
- Using tuple which is immutable and not key-value
1
/ \
2 3
\ \
4 5
What is the top view of this tree?Solution
Step 1: Assign horizontal distances
Root (1) is at 0, left child (2) at -1, right child (3) at +1, node 4 at 0 (right of 2), node 5 at +2 (right of 3).Step 2: Select first nodes at each horizontal distance
At -1: 2, at 0: 1 (4 is below 1), at +1: 3, at +2: 5.Final Answer:
[2, 1, 3, 5] -> Option AQuick Check:
Top view nodes by horizontal distance = [2,1,3,5] [OK]
- Including node 4 instead of node 1 at horizontal distance 0
- Missing node 5 at horizontal distance +2
- Confusing order of nodes in output
from collections import deque
def top_view(root):
if not root:
return []
q = deque([(root, 0)])
hd_node = {}
while q:
node, hd = q.pop()
if hd not in hd_node:
hd_node[hd] = node.data
if node.left:
q.append((node.left, hd - 1))
if node.right:
q.append((node.right, hd + 1))
return [hd_node[hd] for hd in sorted(hd_node)]
Solution
Step 1: Analyze queue operations
The code uses deque as a queue but uses q.pop(), which removes from the right (stack behavior), not from the left (queue behavior).Step 2: Understand traversal order impact
Top view requires level order traversal (BFS), so nodes must be processed in FIFO order using q.popleft(). Using pop() reverses order and causes incorrect results.Final Answer:
Using q.pop() instead of q.popleft() causes wrong traversal order -> Option AQuick Check:
Use popleft() for BFS queue traversal [OK]
- Confusing pop() with popleft() in deque
- Not realizing BFS needs FIFO order
- Thinking dictionary initialization is the problem
Solution
Step 1: Understand top view node selection
Top view includes the first node encountered at each horizontal distance during level order traversal (BFS), which means the node closest to the root vertically.Step 2: Eliminate other options
Maximum value or last node in traversal is not considered; all nodes at same horizontal distance are not included, only the first one.Final Answer:
The node that appears first in level order traversal at that horizontal distance -> Option BQuick Check:
Top view = first node at horizontal distance in BFS [OK]
- Choosing node by value instead of position
- Including all nodes at same horizontal distance
- Picking last node instead of first in BFS
Ready to prove it?
Pass the test and this pattern moves unknown
