Tree Traversal Level Order BFS in DSA Java - Time & Space Complexity
We want to understand how the time needed to visit all nodes in a tree grows as the tree gets bigger.
How does the number of steps change when we use level order traversal (BFS)?
Analyze the time complexity of the following code snippet.
public void levelOrderTraversal(TreeNode root) {
if (root == null) return;
Queue queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(node.val + " ");
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
}
This code visits each node in the tree level by level, from top to bottom and left to right.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Visiting each node once and adding its children to the queue.
- How many times: Exactly once per node in the tree.
As the number of nodes grows, the steps to visit all nodes grow at the same rate.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 visits and queue operations |
| 100 | About 100 visits and queue operations |
| 1000 | About 1000 visits and queue operations |
Pattern observation: The number of operations grows directly with the number of nodes.
Time Complexity: O(n)
This means the time to complete the traversal grows linearly with the number of nodes in the tree.
[X] Wrong: "Since we use a queue and loops, the time must be more than linear, maybe quadratic."
[OK] Correct: Each node is visited once and added/removed from the queue once, so operations scale directly with node count, not more.
Understanding level order traversal time helps you explain how tree algorithms scale, a key skill in many coding challenges.
"What if the tree was very unbalanced, like a linked list? How would the time complexity change?"
Practice
Solution
Step 1: Understand Level Order Traversal
Level order traversal visits nodes level by level starting from the root, moving left to right at each level.Step 2: Compare with other traversals
Other traversals like inorder or postorder do not visit nodes level-wise but follow subtree orders.Final Answer:
Visits nodes level by level from top to bottom, left to right -> Option CQuick Check:
Level Order = BFS = top-down, left-right [OK]
- Confusing level order with inorder or preorder traversal
- Thinking traversal is random
- Mixing left and right subtree orders
Solution
Step 1: Identify correct queue initialization
Java's Queue interface is implemented by LinkedList, so Queue<TreeNode> queue = new LinkedList<>() is correct.Step 2: Check other options
ArrayList does not implement Queue, List is not a Queue, and Stack is LIFO, not FIFO needed for BFS.Final Answer:
Queue<TreeNode> queue = new LinkedList<>(); -> Option BQuick Check:
Queue for BFS = LinkedList implementation [OK]
- Using ArrayList instead of Queue
- Using Stack which is LIFO, not FIFO
- Declaring List instead of Queue
1
/ \
2 3
/ \
4 5
// Code snippet:
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(node.val + " ");
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}Solution
Step 1: Trace the queue operations
Start with root (1). Print 1, add children 2 and 3. Then print 2, add 4 and 5. Then print 3 (no children). Then print 4 and 5.Step 2: Write output sequence
Output is: 1 2 3 4 5Final Answer:
1 2 3 4 5 -> Option AQuick Check:
Level order output = 1 2 3 4 5 [OK]
- Mixing preorder or inorder output with level order
- Adding children in wrong order
- Printing before adding children
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.peek();
System.out.print(node.val + " ");
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}Solution
Step 1: Understand peek() vs poll()
peek() returns the front element but does not remove it, so the queue never empties.Step 2: Effect on loop
Since queue is never emptied, while loop runs infinitely printing the same node repeatedly.Final Answer:
Using peek() instead of poll() causes infinite loop -> Option AQuick Check:
poll() removes front, peek() does not [OK]
- Confusing peek() and poll()
- Ignoring null root check
- Using Stack instead of Queue
Solution
Step 1: Track nodes per level using queue size
At each iteration, get the current queue size which equals nodes at that level. Process exactly that many nodes, then print newline.Step 2: Print nodes level-wise
This ensures nodes of one level print on one line, then move to next line for next level.Final Answer:
Use a queue and track the number of nodes at each level, printing a newline after each level -> Option DQuick Check:
Queue size = nodes per level for line breaks [OK]
- Using recursion which is not level order
- Using stack which reverses order
- Not tracking level size, so no line breaks
Ready to prove it?
Pass the test and this pattern moves unknown
