Right Side View of Binary Tree in DSA C# - Time & Space Complexity
We want to understand how long it takes to find the right side view of a binary tree.
Specifically, how the time grows as the tree gets bigger.
Analyze the time complexity of the following code snippet.
public IList<int> RightSideView(TreeNode root) {
var result = new List<int>();
if (root == null) return result;
var queue = new Queue<TreeNode>();
queue.Enqueue(root);
while (queue.Count > 0) {
int size = queue.Count;
for (int i = 0; i < size; i++) {
var node = queue.Dequeue();
if (i == size - 1) result.Add(node.val);
if (node.left != null) queue.Enqueue(node.left);
if (node.right != null) queue.Enqueue(node.right);
}
}
return result;
}
This code finds the rightmost node at each level of the binary tree using a breadth-first search.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Visiting each node once in the tree.
- How many times: Each node is enqueued and dequeued exactly one time.
- The outer while loop runs once per tree level, but the inner for loop processes all nodes at that level.
As the number of nodes (n) grows, the code visits each node once.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 visits |
| 100 | About 100 visits |
| 1000 | About 1000 visits |
Pattern observation: The number of operations grows linearly with the number of nodes.
Time Complexity: O(n)
This means the time to find the right side view grows directly with the number of nodes in the tree.
[X] Wrong: "The code visits nodes multiple times, so time is more than linear."
[OK] Correct: Each node is processed exactly once, so the time grows only once per node.
Understanding this linear time complexity helps you explain efficient tree traversals clearly and confidently.
"What if we used a depth-first search instead of breadth-first search? How would the time complexity change?"
Practice
RightSideView(root) returns which nodes?Solution
Step 1: Understand the problem context
The right side view means seeing the tree from the right side, so only nodes visible from that angle are included.Step 2: Identify what nodes are visible
These are the rightmost nodes at each level of the tree, as nodes behind them are hidden.Final Answer:
Nodes visible when the tree is viewed from the right side -> Option DQuick Check:
Right side view = rightmost nodes [OK]
- Confusing right side view with left side view
- Including all leaf nodes instead of rightmost nodes
- Thinking it returns all nodes at the deepest level
class Solution { public IList<int> RightSideView(TreeNode root) { ... } }Solution
Step 1: Analyze the return type
The method should return a list of integers representing node values visible from the right side, so IList<int> is appropriate.Step 2: Check parameter and method signature
The parameter should be the root node of type TreeNode, and the method should return the list, not void or a single int.Final Answer:
public IList<int> RightSideView(TreeNode root) -> Option BQuick Check:
Return list of int values from TreeNode root [OK]
- Returning void instead of a list
- Returning a single int instead of a list
- Wrong parameter type like int instead of TreeNode
class TreeNode {
public int val;
public TreeNode left, right;
public TreeNode(int v) { val = v; }
}
var root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.right = new TreeNode(5);
root.right.right = new TreeNode(4);
var result = RightSideView(root);
Console.WriteLine(string.Join(", ", result));
IList<int> RightSideView(TreeNode root) {
var view = new List<int>();
var queue = new Queue<TreeNode>();
if (root != null) queue.Enqueue(root);
while (queue.Count > 0) {
int size = queue.Count;
for (int i = 0; i < size; i++) {
var node = queue.Dequeue();
if (node.left != null) queue.Enqueue(node.left);
if (node.right != null) queue.Enqueue(node.right);
if (i == size - 1) view.Add(node.val);
}
}
return view;
}Solution
Step 1: Trace the tree levels and nodes
Level 1: Node 1; Level 2: Nodes 2 and 3; Level 3: Nodes 5 and 4.Step 2: Identify rightmost nodes at each level
Level 1 rightmost: 1; Level 2 rightmost: 3; Level 3 rightmost: 4.Final Answer:
[1, 3, 4] -> Option AQuick Check:
Rightmost nodes per level = [1, 3, 4] [OK]
- Choosing leftmost nodes instead of rightmost
- Mixing node values from different levels
- Forgetting to add last node of each level
IList<int> RightSideView(TreeNode root) {
var view = new List<int>();
var queue = new Queue<TreeNode>();
if (root != null) queue.Enqueue(root);
while (queue.Count > 0) {
int size = queue.Count;
for (int i = 0; i <= size; i++) {
var node = queue.Dequeue();
if (node.left != null) queue.Enqueue(node.left);
if (node.right != null) queue.Enqueue(node.right);
if (i == size - 1) view.Add(node.val);
}
}
return view;
}Solution
Step 1: Check the for loop boundary
The for loop runs from i = 0 to i <= size, which means it runs size+1 times, causing an error when dequeueing.Step 2: Correct the loop condition
It should run exactly size times, so condition must be i < size to avoid dequeueing from empty queue.Final Answer:
The for loop condition should be i < size, not i <= size -> Option CQuick Check:
Loop runs size times, not size+1 [OK]
- Using <= instead of < in loop condition
- Using stack instead of queue for BFS
- Clearing result list inside loop mistakenly
Example tree:
1
/
2
\
3
\
4What is the right side view output?
Solution
Step 1: Visualize the tree and levels
Level 1: Node 1; Level 2: Node 2; Level 3: Node 3; Level 4: Node 4.Step 2: Determine rightmost nodes at each level
At level 2, node 2 is on the left, but node 3 is the right child of 2 and is visible from the right side. So the rightmost nodes per level are 1, 3, and 4.Final Answer:
[1, 3, 4] -> Option AQuick Check:
Right side view includes nodes visible from right side, skipping node 2 at level 2 [OK]
- Skipping nodes with only left children
- Assuming only right children appear in right side view
- Returning all nodes instead of rightmost nodes
Ready to prove it?
Pass the test and this pattern moves unknown
