Level Order Traversal (Breadth First Search) of Binary Tree
Last Updated : 8 Dec, 2025
Level Order Traversal technique is a method to traverse a Tree such that all nodes present in the same level are traversed completely before traversing the next level.
[Approach] Using Recursion - O(n) time and O(n) space
The idea is to traverse the tree recursively, starting from the root at level 0. When a node is visited, its value is added to the result array at the index corresponding to its level, and then its left and right children are recursively processed in the same way. This effectively performs a level-order traversal using recursion.
C++
#include<iostream>#include<vector>usingnamespacestd;classNode{public:intdata;Node*left,*right;// Constructor to initialize a new nodeNode(intvalue){data=value;left=nullptr;right=nullptr;}};voidlevelOrderRec(Node*root,intlevel,vector<vector<int>>&res){// Base caseif(root==nullptr)return;// Add a new level to the result if neededif(res.size()<=level)res.push_back({});// Add current node's data to its corresponding levelres[level].push_back(root->data);// Recur for left and right childrenlevelOrderRec(root->left,level+1,res);levelOrderRec(root->right,level+1,res);}// Function to perform level order traversalvector<vector<int>>levelOrder(Node*root){// Stores the result level by levelvector<vector<int>>res;levelOrderRec(root,0,res);returnres;}intmain(){// 5// / \ // 12 13// / \ \ // 7 14 2// / \ / \ / \ //17 23 27 3 8 11Node*root=newNode(5);root->left=newNode(12);root->right=newNode(13);root->left->left=newNode(7);root->left->right=newNode(14);root->right->right=newNode(2);root->left->left->left=newNode(17);root->left->left->right=newNode(23);root->left->right->left=newNode(27);root->left->right->right=newNode(3);root->right->right->left=newNode(8);root->right->right->right=newNode(11);vector<vector<int>>res=levelOrder(root);for(vector<int>level:res){for(intval:level){cout<<val<<" ";}cout<<endl;}return0;}
Java
importjava.util.ArrayList;classNode{intdata;Nodeleft,right;Node(intvalue){data=value;left=null;right=null;}}publicclassGfG{voidlevelOrderRec(Noderoot,intlevel,ArrayList<ArrayList<Integer>>res){// Base caseif(root==null)return;// Add a new level to the result if neededif(res.size()<=level)res.add(newArrayList<>());// Add current node's data to its corresponding// levelres.get(level).add(root.data);// Recur for left and right childrenlevelOrderRec(root.left,level+1,res);levelOrderRec(root.right,level+1,res);}// Function to perform level order traversalArrayList<ArrayList<Integer>>levelOrder(Noderoot){// Stores the result level by levelArrayList<ArrayList<Integer>>res=newArrayList<>();levelOrderRec(root,0,res);returnres;}publicstaticvoidmain(String[]args){// 5// / \// 12 13// / \ \// 7 14 2// / \ / \ / \//17 23 27 3 8 11Noderoot=newNode(5);root.left=newNode(12);root.right=newNode(13);root.left.left=newNode(7);root.left.right=newNode(14);root.right.right=newNode(2);root.left.left.left=newNode(17);root.left.left.right=newNode(23);root.left.right.left=newNode(27);root.left.right.right=newNode(3);root.right.right.left=newNode(8);root.right.right.right=newNode(11);GfGtree=newGfG();ArrayList<ArrayList<Integer>>res=tree.levelOrder(root);for(ArrayList<Integer>level:res){for(intval:level){System.out.print(val+" ");}System.out.println();}}}
Python
classNode:def__init__(self,value):self.data=valueself.left=Noneself.right=NonedeflevelOrderRec(root,level,res):# Base caseifrootisNone:return# Add a new level to the result if needediflen(res)<=level:res.append([])# Add current node's data to its corresponding levelres[level].append(root.data)# Recur for left and right childrenlevel_order_rec(root.left,level+1,res)level_order_rec(root.right,level+1,res)# Function to perform level order traversaldeflevelOrder(root):# Stores the result level by levelres=[]level_order_rec(root,0,res)returnresif__name__=='__main__':# 5# / \# 12 13# / \ \# 7 14 2# / \ / \ / \#17 23 27 3 8 11root=Node(5)root.left=Node(12)root.right=Node(13)root.left.left=Node(7)root.left.right=Node(14)root.right.right=Node(2)root.left.left.left=Node(17)root.left.left.right=Node(23)root.left.right.left=Node(27)root.left.right.right=Node(3)root.right.right.left=Node(8)root.right.right.right=Node(11)res=level_order(root)forlevelinres:print(' '.join(map(str,level)))
C#
usingSystem;usingSystem.Collections.Generic;classNode{publicintdata;publicNodeleft,right;// Constructor to initialize a new nodepublicNode(intvalue){data=value;left=null;right=null;}}classGfG{staticvoidlevelOrderRec(Noderoot,intlevel,List<List<int>>res){// Base caseif(root==null)return;// Add a new level to the result if neededif(res.Count<=level)res.Add(newList<int>());// Add current node's data to its corresponding// levelres[level].Add(root.data);// Recur for left and right childrenlevelOrderRec(root.left,level+1,res);levelOrderRec(root.right,level+1,res);}// Function to perform level order traversalstaticList<List<int>>levelOrder(Noderoot){// Stores the result level by levelList<List<int>>res=newList<List<int>>();levelOrderRec(root,0,res);returnres;}staticvoidMain(){// 5// / \// 12 13// / \ \// 7 14 2// / \ / \ / \//17 23 27 3 8 11Noderoot=newNode(5);root.left=newNode(12);root.right=newNode(13);root.left.left=newNode(7);root.left.right=newNode(14);root.right.right=newNode(2);root.left.left.left=newNode(17);root.left.left.right=newNode(23);root.left.right.left=newNode(27);root.left.right.right=newNode(3);root.right.right.left=newNode(8);root.right.right.right=newNode(11);List<List<int>>res=levelOrder(root);// Print level by levelforeach(varlevelinres){foreach(intvalinlevel){Console.Write(val+" ");}Console.WriteLine();}}}
JavaScript
classNode{constructor(value){this.data=value;this.left=null;this.right=null;}}functionlevelOrderRec(root,level,res){// Base caseif(root===null)return;// Add a new level to the result if neededif(res.length<=level)res.push([]);// Add current node's data to its corresponding levelres[level].push(root.data);// Recur for left and right childrenlevelOrderRec(root.left,level+1,res);levelOrderRec(root.right,level+1,res);}// Function to perform level order traversalfunctionlevelOrder(root){// Stores the result level by levelconstres=[];levelOrderRec(root,0,res);returnres;}// Driver Code// 5// / \// 12 13// / \ \// 7 14 2// / \ / \ / \//17 23 27 3 8 11constroot=newNode(5);root.left=newNode(12);root.right=newNode(13);root.left.left=newNode(7);root.left.right=newNode(14);root.right.right=newNode(2);root.left.left.left=newNode(17);root.left.left.right=newNode(23);root.left.right.left=newNode(27);root.left.right.right=newNode(3);root.right.right.left=newNode(8);root.right.right.right=newNode(11);constres=levelOrder(root);for(constlevelofres){console.log(level.join(' '));}
Output
5
12 13
7 14 2
17 23 27 3 8 11
[Expected Approach] Using Queue (Iterative) - O(n) time and O(n) space
The idea is to use a queue to traverse the tree level by level. Start by adding the root to the queue. Then, repeatedly remove a node from the queue, store its value in the result, and add its left and right children to the queue. Continue this process until the queue is empty.
C++
#include<iostream>#include<queue>#include<vector>usingnamespacestd;classNode{public:intdata;Node*left,*right;// Constructor to initialize a new nodeNode(intvalue){data=value;left=nullptr;right=nullptr;}};// Iterative method to perform level order traversalvector<vector<int>>levelOrder(Node*root){if(root==nullptr)return{};// Create an empty queue for level order traversalqueue<Node*>q;vector<vector<int>>res;// Enqueue Rootq.push(root);intcurrLevel=0;while(!q.empty()){intlen=q.size();res.push_back({});for(inti=0;i<len;i++){// Add front of queue and remove it from queueNode*node=q.front();q.pop();res[currLevel].push_back(node->data);// Enqueue left childif(node->left!=nullptr)q.push(node->left);// Enqueue right childif(node->right!=nullptr)q.push(node->right);}currLevel++;}returnres;}intmain(){// 5// / \ // 12 13// / \ \ // 7 14 2// / \ / \ / \ //17 23 27 3 8 11Node*root=newNode(5);root->left=newNode(12);root->right=newNode(13);root->left->left=newNode(7);root->left->right=newNode(14);root->right->right=newNode(2);root->left->left->left=newNode(17);root->left->left->right=newNode(23);root->left->right->left=newNode(27);root->left->right->right=newNode(3);root->right->right->left=newNode(8);root->right->right->right=newNode(11);vector<vector<int>>res=levelOrder(root);for(vector<int>level:res){for(intval:level){cout<<val<<" ";}cout<<endl;}return0;}
Java
importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.Queue;classNode{intdata;Nodeleft,right;Node(intvalue){data=value;left=null;right=null;}}// Iterative method to perform level order traversalpublicclassGfG{publicstaticArrayList<ArrayList<Integer>>levelOrder(Noderoot){if(root==null)returnnewArrayList<>();// Create an empty queue for level order traversalQueue<Node>q=newLinkedList<>();ArrayList<ArrayList<Integer>>res=newArrayList<>();// Enqueue Rootq.offer(root);intcurrLevel=0;while(!q.isEmpty()){intlen=q.size();res.add(newArrayList<>());for(inti=0;i<len;i++){// Add front of queue and remove it from// queueNodenode=q.poll();res.get(currLevel).add(node.data);// Enqueue left childif(node.left!=null)q.offer(node.left);// Enqueue right childif(node.right!=null)q.offer(node.right);}currLevel++;}returnres;}publicstaticvoidmain(String[]args){// 5// / \// 12 13// / \ \// 7 14 2// / \ / \ / \//17 23 27 3 8 11Noderoot=newNode(5);root.left=newNode(12);root.right=newNode(13);root.left.left=newNode(7);root.left.right=newNode(14);root.right.right=newNode(2);root.left.left.left=newNode(17);root.left.left.right=newNode(23);root.left.right.left=newNode(27);root.left.right.right=newNode(3);root.right.right.left=newNode(8);root.right.right.right=newNode(11);// Perform level order traversal and get the resultArrayList<ArrayList<Integer>>res=levelOrder(root);for(ArrayList<Integer>level:res){for(intval:level){System.out.print(val+" ");}System.out.println();}}}
Python
classNode:def__init__(self,value):self.data=valueself.left=Noneself.right=None# Iterative method to perform level order traversaldeflevelOrder(root):ifrootisNone:return[]# Create an empty queue for level order traversalq=[]res=[]# Enqueue Rootq.append(root)curr_level=0whileq:len_q=len(q)res.append([])for_inrange(len_q):# Add front of queue and remove it from queuenode=q.pop(0)res[curr_level].append(node.data)# Enqueue left childifnode.leftisnotNone:q.append(node.left)# Enqueue right childifnode.rightisnotNone:q.append(node.right)curr_level+=1returnresif__name__=='__main__':# 5# / \# 12 13# / \ \# 7 14 2# / \ / \ / \#17 23 2 3 8 11root=Node(5)root.left=Node(12)root.right=Node(13)root.left.left=Node(7)root.left.right=Node(14)root.right.right=Node(2)root.left.left.left=Node(17)root.left.left.right=Node(23)root.left.right.left=Node(27)root.left.right.right=Node(3)root.right.right.left=Node(8)root.right.right.right=Node(11)# Perform level order traversal and get the resultres=levelOrder(root)forlevelinres:forvalinlevel:print(val,end=' ')print()
C#
usingSystem;usingSystem.Collections.Generic;classNode{publicintdata;publicNodeleft,right;// Constructor to initialize a new nodepublicNode(intvalue){data=value;left=null;right=null;}}classGfG{// Iterative method to perform level order traversalstaticList<List<int>>levelOrder(Noderoot){if(root==null)returnnewList<List<int>>();// Create an empty queue for level order traversalQueue<Node>q=newQueue<Node>();List<List<int>>res=newList<List<int>>();// Enqueue Rootq.Enqueue(root);intcurrLevel=0;while(q.Count>0){intlen=q.Count;res.Add(newList<int>());for(inti=0;i<len;i++){// Add front of queue and remove it from queueNodenode=q.Dequeue();res[currLevel].Add(node.data);// Enqueue left childif(node.left!=null)q.Enqueue(node.left);// Enqueue right childif(node.right!=null)q.Enqueue(node.right);}currLevel++;}returnres;}staticvoidMain(){// 5// / \// 12 13// / \ \// 7 14 2// / \ / \ / \//17 23 27 3 8 11Noderoot=newNode(5);root.left=newNode(12);root.right=newNode(13);root.left.left=newNode(7);root.left.right=newNode(14);root.right.right=newNode(2);root.left.left.left=newNode(17);root.left.left.right=newNode(23);root.left.right.left=newNode(27);root.left.right.right=newNode(3);root.right.right.left=newNode(8);root.right.right.right=newNode(11);List<List<int>>res=levelOrder(root);foreach(List<int>levelinres){foreach(intvalinlevel){Console.Write(val+" ");}Console.WriteLine();}}}
JavaScript
classNode{constructor(value){this.data=value;this.left=null;this.right=null;}}// Iterative method to perform level order traversalfunctionlevelOrder(root){if(root===null)return[];// Create an empty queue for level order traversalletq=[];letres=[];// Enqueue Rootq.push(root);letcurrLevel=0;while(q.length>0){letlen=q.length;res.push([]);for(leti=0;i<len;i++){// Add front of queue and remove it from queueletnode=q.shift();res[currLevel].push(node.data);// Enqueue left childif(node.left!==null)q.push(node.left);// Enqueue right childif(node.right!==null)q.push(node.right);}currLevel++;}returnres;}//Driver Code// 5// / \// 12 13// / \ \// 7 14 2// / \ / \ / \//17 23 27 3 8 11constroot=newNode(5);root.left=newNode(12);root.right=newNode(13);root.left.left=newNode(7);root.left.right=newNode(14);root.right.right=newNode(2);root.left.left.left=newNode(17);root.left.left.right=newNode(23);root.left.right.left=newNode(27);root.left.right.right=newNode(3);root.right.right.left=newNode(8);root.right.right.right=newNode(11);// Perform level order traversal and get the resultconstres=levelOrder(root);for(constlevelofres){console.log(level.join(' '));}