using System; using System.Collections.Generic; public class Node { public int val; public Node left, right; public Node(int v) { val = v; left = right = null; } } public class Program { public static void LevelOrder(Node root) { if (root == null) return; Queue<Node> q = new Queue<Node>(); q.Enqueue(root); while (q.Count > 0) { Node current = q.Dequeue(); Console.Write(current.val + " "); if (current.left != null) q.Enqueue(current.left); if (current.right != null) q.Enqueue(current.right); } } public static void Main() { Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.right = new Node(6); LevelOrder(root); } }
The code uses a queue to visit nodes level by level.
Starting from root (1), it visits nodes in this order: 1, then 2 and 3, then 4, 5, and 6.
using System; using System.Collections.Generic; public class Node { public int val; public Node left, right; public Node(int v) { val = v; left = right = null; } } public class Program { public static void LevelOrder(Node root) { if (root == null) return; Queue<Node> q = new Queue<Node>(); q.Enqueue(root); while (q.Count > 0) { Node current = q.Dequeue(); Console.Write(current.val + " "); if (current.left != null) q.Enqueue(current.left); if (current.right != null) q.Enqueue(current.right); } } public static void Main() { Node root = new Node(10); root.left = new Node(20); root.right = null; root.left.left = null; root.left.right = new Node(30); LevelOrder(root); } }
The traversal visits root (10), then its left child (20), then 20's right child (30).
Null children are not enqueued.
BFS visits nodes level by level, so nodes must be processed in the order they were discovered.
A queue ensures first-in-first-out order, which matches this requirement.
using System; using System.Collections.Generic; public class Node { public int val; public Node left, right; public Node(int v) { val = v; left = right = null; } } public class Program { public static void LevelOrder(Node root) { if (root == null) return; Queue<Node> q = new Queue<Node>(); q.Enqueue(root); while (q.Count > 0) { Node current = q.Dequeue(); Console.Write(current.val + " "); if (current.right != null) q.Enqueue(current.right); if (current.left != null) q.Enqueue(current.left); } } public static void Main() { Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.right = new Node(6); LevelOrder(root); } }
Since right child is enqueued before left, nodes at each level are visited from right to left.
Traversal order: 1, then 3 and 2, then 6, 5, and 4.
using System; using System.Collections.Generic; public class Node { public int val; public Node left, right; public Node(int v) { val = v; left = right = null; } } public class Program { public static void LevelOrder(Node root) { if (root == null) return; Queue<Node> q = new Queue<Node>(); q.Enqueue(root); while (q.Count > 0) { Node current = q.Dequeue(); Console.Write(current.val + " "); if (current.left != null) q.Enqueue(current.left); if (current.right != null) q.Enqueue(current.right); q.Dequeue(); } } public static void Main() { Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); LevelOrder(root); } }
The extra q.Dequeue() inside the loop removes an element without processing it.
This causes the queue to become empty prematurely, leading to an InvalidOperationException when trying to dequeue from an empty queue.
