Vertical Order Traversal of Binary Tree in DSA Java - Time & Space Complexity
We want to understand how the time needed to do vertical order traversal grows as the tree gets bigger.
Specifically, how does the number of steps change when the number of nodes increases?
Analyze the time complexity of the following code snippet.
public List> verticalOrder(TreeNode root) {
Map> map = new TreeMap<>();
Queue> queue = new LinkedList<>();
queue.offer(new Pair<>(root, 0));
while (!queue.isEmpty()) {
Pair p = queue.poll();
TreeNode node = p.getKey();
int col = p.getValue();
map.computeIfAbsent(col, k -> new ArrayList<>()).add(node.val);
if (node.left != null) queue.offer(new Pair<>(node.left, col - 1));
if (node.right != null) queue.offer(new Pair<>(node.right, col + 1));
}
return new ArrayList<>(map.values());
}
This code does a breadth-first search to group tree nodes by their vertical column index.
- Primary operation: The while loop that visits each node once.
- How many times: Exactly once per node, so n times for n nodes.
- Inside the loop, adding nodes to a map and queue happens once per node.
As the number of nodes grows, the number of steps grows roughly the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 visits and map insertions |
| 100 | About 100 visits and map insertions |
| 1000 | About 1000 visits and map insertions |
Pattern observation: The work grows linearly with the number of nodes.
Time Complexity: O(n log k)
This means the time grows mostly with the number of nodes n, and also with the number of vertical columns k due to map operations.
[X] Wrong: "The time complexity is just O(n) because we visit each node once."
[OK] Correct: We also do map insertions which take O(log k) time each, where k is the number of vertical columns, so the total is O(n log k).
Understanding this complexity helps you explain how your solution scales with tree size and structure, a key skill in interviews.
"What if we used a HashMap instead of a TreeMap for storing columns? How would the time complexity change?"
Practice
Vertical Order Traversal of a binary tree mean?Solution
Step 1: Understand vertical columns in a tree
Vertical order groups nodes by their horizontal distance from the root, called columns.Step 2: Define vertical order traversal
Nodes in the same vertical column are collected and output from leftmost to rightmost column.Final Answer:
Nodes are grouped by their vertical columns from left to right -> Option AQuick Check:
Vertical order = group by columns [OK]
- Confusing vertical order with level order traversal
- Thinking vertical order is preorder or inorder traversal
- Mixing horizontal rows with vertical columns
Solution
Step 1: Identify need to map columns to nodes
We need to group nodes by their vertical column index, so a map from column to list of nodes is needed.Step 2: Choose suitable Java data structure
A HashMap with key as column index (Integer) and value as list of nodes (List<Integer>) fits perfectly.Final Answer:
HashMap -> Option BQuick Check:
Map column to nodes = HashMap [OK]
- Using ArrayList alone without mapping columns
- Using Stack or Queue which don't map keys to lists
- Confusing data structures for traversal order
1
/ \
2 3
/ \ \
4 5 6
Solution
Step 1: Assign column indices to nodes
Root 1 is at column 0. Left child 2 at -1, right child 3 at +1. 4 at -2, 5 at 0, 6 at +2.Step 2: Collect nodes column-wise from left to right
Columns: -2: [4], -1: [2], 0: [1,5], 1: [3], 2: [6]. Combine: [4, 2, 1, 5, 3, 6]Final Answer:
[4, 2, 1, 5, 3, 6] -> Option CQuick Check:
Columns left to right = [4,2,1,5,3,6] [OK]
- Ignoring multiple nodes in same column order
- Mixing preorder or inorder output with vertical order
- Not assigning correct column indices
Map map = new HashMap<>();
Queue> queue = new LinkedList<>();
queue.add(new Pair(root, 0));
while (!queue.isEmpty()) {
Pair p = queue.poll();
TreeNode node = p.getKey();
int col = p.getValue();
map.putIfAbsent(col, new ArrayList<>());
map.get(col).add(node.val);
if (node.left != null) queue.add(new Pair(node.left, col - 1));
if (node.right != null) queue.add(new Pair(node.right, col + 1));
}
Solution
Step 1: Check usage of Pair class
The code uses Pair but Java does not have Pair by default; it must be imported or defined.Step 2: Identify missing import or definition
Without importing javafx.util.Pair or defining a custom Pair class, this code will not compile.Final Answer:
Pair class is not imported or defined -> Option AQuick Check:
Missing Pair class causes compile error [OK]
- Assuming Pair is built-in in Java standard library
- Using Stack instead of Queue for BFS traversal
- Incorrect column increment direction for left child
Solution
Step 1: Understand sorting by row and value in vertical columns
We need to group nodes by column, then by row, and sort nodes with same row by value.Step 2: Choose data structure supporting nested sorting
TreeMap for columns and rows keeps keys sorted. PriorityQueue stores nodes sorted by value. So TreeMap> fits.Final Answer:
Use a TreeMap> to map column -> row -> sorted nodes -> Option DQuick Check:
Nested TreeMaps + PriorityQueue = sorted vertical order [OK]
- Sorting lists after traversal loses row info
- Using Stack or Queue which don't sort nodes
- Ignoring row sorting within columns
Ready to prove it?
Pass the test and this pattern moves unknown
