Problem Statement
Given the root of a binary tree, return its vertical order traversal.
Rules:
- Nodes are grouped by their column (Horizontal Distance).
- If multiple nodes share the same row and column, sort them by value.
Brute Force Intuition
In an interview, you can explain it like this:
Traverse every node, store its row and column information, then sort all collected nodes based on column, row, and value.
Although correct, sorting all nodes together becomes expensive.
Complexity
- Time Complexity: O(N log N)
- Space Complexity: O(N)
Moving Towards the Optimal Approach
Observe that every node has:
Column (Horizontal Distance)
+
Row (Depth)
If we store nodes using:
Column
β
Row
β
Values
we can build the answer naturally.
Pattern Recognition
Whenever you see:
- Vertical Traversal
- Column-wise Traversal
- Horizontal Distance
Think:
BFS + Ordered Maps
Key Observation
Assign coordinates:
Root
β
(Row = 0, Col = 0)
Rules:
Left Child
β
(Row + 1, Col - 1)
--------------------
Right Child
β
(Row + 1, Col + 1)
Store nodes as:
TreeMap<
Column,
TreeMap<
Row,
PriorityQueue<Values>
>
>
Optimal Approach
Step 1
Perform BFS.
Store:
(Node, Row, Column)
Step 2
Insert into:
column
β
row
β
priority queue
Step 3
Traverse:
Columns
β
Rows
β
Sorted Values
Optimal Java Solution
class Pair {
TreeNode node;
int row;
int col;
Pair(TreeNode node,
int row,
int col) {
this.node = node;
this.row = row;
this.col = col;
}
}
class Solution {
public List<List<Integer>> verticalTraversal(TreeNode root) {
TreeMap<Integer,
TreeMap<Integer,
PriorityQueue<Integer>>> map =
new TreeMap<>();
Queue<Pair> q = new LinkedList<>();
q.offer(new Pair(root, 0, 0));
while (!q.isEmpty()) {
Pair curr = q.poll();
map.putIfAbsent(curr.col,
new TreeMap<>());
map.get(curr.col)
.putIfAbsent(curr.row,
new PriorityQueue<>());
map.get(curr.col)
.get(curr.row)
.offer(curr.node.val);
if (curr.node.left != null)
q.offer(new Pair(
curr.node.left,
curr.row + 1,
curr.col - 1));
if (curr.node.right != null)
q.offer(new Pair(
curr.node.right,
curr.row + 1,
curr.col + 1));
}
List<List<Integer>> ans =
new ArrayList<>();
for (TreeMap<Integer,
PriorityQueue<Integer>> rows
: map.values()) {
List<Integer> list =
new ArrayList<>();
for (PriorityQueue<Integer> pq
: rows.values()) {
while (!pq.isEmpty())
list.add(pq.poll());
}
ans.add(list);
}
return ans;
}
}
Dry Run
3
/ \
9 20
/ \
15 7
Coordinates:
9
β
(-1,1)
3
β
(0,0)
15
β
(0,2)
20
β
(1,1)
7
β
(2,2)
Vertical Order:
9
β
3 15
β
20
β
7
Answer:
[[9],[3,15],[20],[7]]
Why BFS + Ordered Maps Work?
Every node is assigned:
Column
β
Row
TreeMap automatically sorts:
Columns
β
Rows
PriorityQueue handles nodes that share the same row and column.
Complexity Analysis
| Metric | Complexity |
|---|---|
| Time Complexity | O(N log N) |
| Space Complexity | O(N) |
Interview One-Liner
Perform BFS while tracking row and column indices, then store nodes in nested TreeMaps with a PriorityQueue to maintain the required ordering.
Pattern Learned
BFS
β
(Row, Column)
β
Ordered Maps
β
Vertical Traversal
Similar Problems
- Vertical Order Traversal
- Top View
- Bottom View
- Vertical Sum
- Diagonal Traversal
Memory Trick
Think:
Node
β
(Row, Column)
β
TreeMap
β
PriorityQueue
β
Answer
Mental Model
Tree
β
Assign Coordinates
β
Group By Column
β
Sort By Row
β
Output
Whenever you hear:
"Vertical Order Traversal"
your brain should immediately think:
BFS + (Row, Column) Coordinates + TreeMap
United States
NORTH AMERICA
Related News
π I Built a Dropshipping Automation Pipeline β Here's What I Learned (and What I'd Do Differently)
10h ago
How I Cut My LLM API Bill by 40x: A Freelancer's Migration Story
10h ago

Mattress Firm Coupons: Save up to $600
3h ago
Google Ordered to Pay $2 Billion For Anti-Competitive Practices By Swedish Court
20h ago
The Censorship Wall: Why Every AI Companion App Ends Up Filtering You
20h ago