Binary tree level order traversal in recursive

 Goal or Objective: Traverse all nodes in a level-wise manner (top to bottom, left to right).

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


🔁 Java Implementation of Recursive Level Order Traversal

Step 1: Find or Evaluate the Height (Depth) of the Tree

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

 For Other information, visit

Ø  File Read and write

Ø  Alarm set program

Ø  How to use Http Client

Ø  Java Swap of two data without third variable Code

Ø  Learn more about XML-to-XML conversion in Java

Ø  Learn DNA/RNA using palindrome mechanism



Binary tree level order traversal in recursive
Binary tree level order traversal in recursive




Post a Comment

0 Comments