Normally done using a queue (BFS), but here we'll
explore the recursive version, its importance, and the math
theory behind it.
✅ What Is Level Order Traversal?
Given this binary tree:
151 /
\ 152 153 / \
/ 154 155 156 |
Level Order Traversal Output: 151 → 152 153 → 154 155 6
🔁
Step 1:
java
public class TreeNode { int information; TreeNode leftSide, rightSide; TreeNode(int information) { this.information= information; this.leftSide= null; this.rightSide= null; } public class KcmLevelOrder { // Step 1: Driver method void kcmLevelOrder(TreeNode k) { int h = kcmHeight(k); for (int i = 1; i <= h; i++) { kcmPrintLevel(k, i); } } // Step 2: Compute height of tree int kcmHeight(TreeNode k) { if (k == null) { return 0; } else { int leftHeight = kcmHeight(k.leftSide); int rightHeight = kcmHeight(k.rightSide); return java.lang.Math.max(leftHeight, rightHeight) + 1; } } // Step 3: Print all nodes at a given level void kcmPrintLevel(TreeNode k, int level) { if (k == null) return; if (level == 1) { System.out.print(" "+k.information+ " "); } else if (level > 1) { kcmPrintLevel(k.leftSide, level - 1); kcmPrintLevel(k.rightSide, level - 1); } } |
Why Recursive Level Order Traversal Is Important
✅ 1. Teaches Tree Depth
Understanding
- It
forces understanding of how tree height works.
- Every
level is a "distance" from the root.
✅ 2. Foundation for BFS Problems
- BFS
often uses iteration + queue, but recursion helps:
- Conceptual
clarity
- Functional
thinking
✅ 3. No Queue Needed
- Queue-based
methods are iterative.
- Recursive
level-order is a pure divide-and-conquer approach.
Mathematical Theorem Behind It
🔷 1. Tree Height = Max
Depth
- Recursive
level-order depends on height h of the tree:
- A
tree with height h will have h levels.
- Each
level i is traversed recursively.
🔷 2. Recursion Uses
Mathematical Induction
Level Order Traversal recursively uses inductive logic:
Base Case: If tree is null, return.
Recursive Case: Print all nodes at current level, then move deeper.
This maps directly to mathematical induction:
- P(1):
Process level 1
- P(k):
If you can process level k, you can process level k+1
🔷 3. Time Complexity
Analysis:
- For
height h and n nodes:
- printLevel(root,
i) takes O(n) time over all levels
- So,
overall time: O(n²) in worst case (e.g., skewed trees)
- Better
for balanced trees
Comparison Table: Recursive vs Iterative Level Order
Feature |
Recursive |
Iterative (Queue-based BFS) |
Memory |
O(h) stack space |
O(w) queue (w = max width) |
Speed |
Slower on unbalanced trees |
Faster O(n) |
Readability |
Very clean and elegant |
More control but verbose |
Math Basis |
Induction, depth recursion |
FIFO logic, graph traversal |
package com.kartik.org; public class BinaryTreeLevelOrder { public static class TreeElementNode { int data; TreeElementNode kleft; TreeElementNode kright; TreeElementNode(int data) { this.data=data; } } // prints data in level order from kleft to kright public static boolean kcmLevelOrderTraversalLeftToRight(TreeElementNode kStartNode,int klevel) { if(null == kStartNode){ return Boolean.FALSE; } if(klevel == 1){ System.out.println(kStartNode.data+"
"); return Boolean.TRUE; } boolean kleft
=kcmLevelOrderTraversalLeftToRight(kStartNode.kleft, klevel-1); boolean kright =kcmLevelOrderTraversalLeftToRight(kStartNode.kright, klevel-1); return kleft || kright; } public static void kcmLevelOrderTraversalLeftToRight(TreeElementNode kStartNode) { if(null == kStartNode){ return; } int level=1; while(kcmLevelOrderTraversalLeftToRight(kStartNode, level++)){ } } //print data kright to kleft public static boolean kcmLevelOrderTraversalRightToLeft(TreeElementNode kStartNode,int klevel) { if(null == kStartNode){ return Boolean.FALSE; } if(klevel == 1){ System.out.println(kStartNode.data+"
"); return Boolean.TRUE; } boolean kright
=kcmLevelOrderTraversalRightToLeft(kStartNode.kright, klevel-1); boolean kleft =kcmLevelOrderTraversalRightToLeft(kStartNode.kleft, klevel-1); return kright || kleft; } public static void kcmLevelOrderTraversalRightToLeft(TreeElementNode kStartNode) { if(null == kStartNode){ return; } int level=1;
while(kcmLevelOrderTraversalRightToLeft(kStartNode, level++)){ System.out.println("-&&&&&&&--"); } } public static void main(String[] args) { // Creating a construct a binary tree TreeElementNode rootNode=constructBinaryTree(); System.out.println("The level order traversal data output of a binary tree will be from left to right. -->:"); kcmLevelOrderTraversalLeftToRight(rootNode); System.out.println("The level order traversal data output of a binary tree will be from right to left.-->:"); kcmLevelOrderTraversalRightToLeft(rootNode); } public static TreeNode constructBinaryTree() { TreeElementNode kk=new TreeElementNode(340); TreeElementNode node320=new TreeElementNode(320); TreeElementNode node310=new TreeElementNode(310); TreeElementNode node330=new TreeElementNode(330); TreeElementNode node360=new TreeElementNode(360); TreeElementNode node350=new TreeElementNode(350); TreeElementNode node370=new TreeElementNode(370); kk.kleft=node320; kk.kright=node360; node320.kleft=node310; node320.kright=node330; node360.kleft=node350; node360.kright=node370; return kk; } } |
It features two traversal approaches: level-order traversal carried out from left to right and level-order traversal conducted or undertaken from right to left. Below is an explanation of the code.
Explanation:
- TreeNode
Class:
- A
static inner class TreeNode represents a node in the binary tree. It has
three fields:
- int
data: Stores the value of the node.
- TreeNode
left: Reference to the left child node.
- TreeNode
right: Reference to the right child node.
- The
constructor TreeNode(int data) initializes the node with the provided
value.
- Level
Order Traversal from Left to Right:
- levelOrderTraversalLeftToRight(TreeNode
startNode, int level):
- This
method recursively traverses the tree level by level, starting from the
given startNode.
- If
the level is 1, it prints the node's data.
- It
recursively calls itself for the left and right subtrees, reducing the
level by 1 in each recursive call.
- It
returns true if the traversal is successful, or false if the startNode
is null.
- levelOrderTraversalLeftToRight(TreeNode
startNode):
- This
method initiates the level-order traversal by calling the previous
method with increasing levels until no nodes are left to traverse.
- Level
Order Traversal from Right to Left:
- levelOrderTraversalRightToLeft(TreeNode
startNode, int level):
- Similar
to the left-to-right traversal method, but the order of traversal is
reversed.
- It
starts with the right subtree first, followed by the left subtree.
- levelOrderTraversalRightToLeft(TreeNode
startNode):
- This
method initiates the right-to-left traversal by calling the previous
method with increasing levels until no nodes are left to traverse.
- Main
Method:
- The main
method creates a binary tree using the createBinaryTree() method.
- It
then prints the tree in level order from left to right and right to left
using the corresponding traversal methods.
- Binary
Tree Structure:
- The createBinaryTree()
method builds a binary tree with the following structure:
markdown
140 /
\ 120 160 /
\ / \ 110 130 150 170 |
- This
tree is used as the input for the traversal methods.
Output:
When you run the code, the output will be:
text
Level Order
traversal of binary tree will be left to Right -->: 140 120 160 110 130 150 170 Level Order
traversal of binary tree will be Right to Left -->: 140 160 120 170 150 130 110 |
Summary:
- Left-to-right
traversal prints nodes level by level starting from the leftmost node
on each level.
- Right-to-left
traversal prints nodes level by level starting from the rightmost node
on each level.
Ø Java Swap of two data without third variable Code
Ø Learn more about XML-to-XML conversion in Java
Ø Learn DNA/RNA using palindrome mechanism
0 Comments