Vertical Order Traversal of Binary Tree in DSA C# - Time & Space Complexity
We want to understand how the time needed to do vertical order traversal 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.
public IList> VerticalOrder(TreeNode root) {
var result = new List>();
if (root == null) return result;
var map = new SortedDictionary>();
var queue = new Queue<(TreeNode node, int col)>();
queue.Enqueue((root, 0));
while (queue.Count > 0) {
var (node, col) = queue.Dequeue();
if (!map.ContainsKey(col)) map[col] = new List();
map[col].Add(node.val);
if (node.left != null) queue.Enqueue((node.left, col - 1));
if (node.right != null) queue.Enqueue((node.right, col + 1));
}
foreach (var key in map.Keys) result.Add(map[key]);
return result;
}
This code visits each node once, grouping nodes by their vertical column index.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Visiting each node once in a breadth-first manner.
- How many times: Exactly once per node, so n times for n nodes.
- Also, inserting and accessing the map for each node's column key.
- Finally, iterating over the sorted keys to build the result.
As the number of nodes grows, the code visits each node once and does a few constant-time operations per node.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 visits plus map insertions and lookups |
| 100 | About 100 visits plus map operations |
| 1000 | About 1000 visits plus map operations |
Pattern observation: The work grows roughly in direct proportion to the number of nodes.
Time Complexity: O(n log k)
This means the time grows mostly with the number of nodes, but also depends on the number of vertical columns (k) because of sorting keys.
[X] Wrong: "The traversal is just O(n) because we visit each node once, so sorting keys doesn't matter."
[OK] Correct: The keys for columns are stored in a sorted structure, so accessing and inserting keys costs extra time depending on how many columns there are.
Understanding how tree traversal and data grouping affect time helps you explain your approach clearly and shows you know how to analyze your code's efficiency.
"What if we used a hash map instead of a sorted dictionary for columns? How would the time complexity change?"
Practice
Solution
Step 1: Understand vertical order traversal
Vertical order traversal groups nodes by their vertical columns, where the root is at column 0, left child at column -1, right child at column +1, and so on.Step 2: Compare with other traversals
Unlike level order or preorder, vertical order focuses on columns, not depth or visit order.Final Answer:
Nodes grouped by their vertical columns from left to right -> Option BQuick Check:
Vertical order = nodes by vertical columns [OK]
- Confusing vertical order with level order traversal
- Thinking vertical order is preorder or postorder
- Ignoring the horizontal distance concept
Solution
Step 1: Identify the data structure needed
We need a dictionary with integer keys (vertical columns) and list of integers as values (nodes in that column).Step 2: Match with C# syntax
var dict = new Dictionary(); correctly declares Dictionary. Others have wrong types or collections.Final Answer:
var dict = new Dictionary(); -> Option AQuick Check:
Dictionary for vertical order [OK]
- Swapping key and value types
- Using List instead of Dictionary for mapping
- Incorrect generic type order
1
/ \
2 3
/ \ \
4 5 6
// Code snippet:
var result = new Dictionary();
void Traverse(TreeNode node, int col) {
if (node == null) return;
if (!result.ContainsKey(col)) result[col] = new List<int>();
result[col].Add(node.val);
Traverse(node.left, col - 1);
Traverse(node.right, col + 1);
}
Traverse(root, 0);
foreach (var col in result.OrderBy(k => k.Key)) {
Console.Write(string.Join(",", col.Value) + " ");
}Solution
Step 1: Assign columns to nodes
Root 1 at col 0; 2 at -1; 3 at +1; 4 at -2; 5 at 0; 6 at +2.Step 2: Group nodes by column and order
col -2: [4], col -1: [2], col 0: [1,5], col 1: [3], col 2: [6]. Printed as 4 2 1,5 3 6 (commas inside multi-node groups, spaces between columns).Final Answer:
4 2 1,5 3 6 -> Option CQuick Check:
Vertical groups with commas inside, spaces between [OK]
- Mixing node order inside columns
- Printing without commas or spaces correctly
- Ignoring column sorting
void Traverse(TreeNode node, int col, Dictionary dict) {
if (node == null) return;
dict[col].Add(node.val);
Traverse(node.left, col - 1, dict);
Traverse(node.right, col + 1, dict);
}
var dict = new Dictionary();
Traverse(root, 0, dict);Solution
Step 1: Analyze dictionary usage
Code tries to add to dict[col] without checking if key col exists, causing KeyNotFoundException.Step 2: Fix by initializing keys
Before adding, check if dict contains col; if not, create new List<int> for that key.Final Answer:
Dictionary keys are not initialized before adding values -> Option DQuick Check:
Initialize dictionary keys before adding [OK]
- Assuming dictionary auto-creates keys
- Ignoring null checks on dictionary values
- Confusing recursion base case with dictionary errors
Solution
Step 1: Understand sorting by depth requirement
We must store nodes with their depth info to sort them top to bottom within each vertical column.Step 2: Choose data structure and approach
Dictionary with key as column and value as list of (depth, value) pairs allows sorting by depth after traversal.Final Answer:
Use a Dictionary> and sort each list by depth after traversal -> Option AQuick Check:
Store depth with nodes, then sort by depth [OK]
- Using queue or stack without depth info
- Sorting by node value instead of depth
- Ignoring depth when grouping nodes
Ready to prove it?
Pass the test and this pattern moves unknown
