Open In App

Print nodes between two given level numbers of a binary tree

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Given a binary tree and two level numbers ‘low’ and ‘high’, print nodes from level low to level high.

For example consider the binary tree given in below diagram. 

Input: Root of below tree, low = 2, high = 4

Output:
8 22
4 12
10 14

BST_LCA

A Simple Method is to first write a recursive function that prints nodes of a given level number. Then call a recursive function in a loop from low to high. Time complexity of this method is O(n2
We can print nodes in O(n) time using queue-based iterative level order traversal. The idea is to do simple queue-based level order traversal. While doing inorder traversal, add a marker node at the end. Whenever we see a marker node, we increase level number. If level number is between low and high, then print nodes. 
The following is the implementation of above idea.

Implementation:

C++




// A C++ program to print Nodes level by level between given two levels.
#include <bits/stdc++.h>
using namespace std;
 
/* A binary tree Node has key, pointer to left and right children */
struct Node
{
    int key;
    struct Node* left, *right;
};
 
/* Given a binary tree, print nodes from level number 'low' to level
   number 'high'*/
void printLevels(Node* root, int low, int high)
{
    queue <Node *> Q;
 
    Node *marker = new Node; // Marker node to indicate end of level
 
    int level = 1;   // Initialize level number
 
    // Enqueue the only first level node and marker node for end of level
    Q.push(root);
    Q.push(marker);
 
    // Simple level order traversal loop
    while (Q.empty() == false)
    {
        // Remove the front item from queue
        Node *n = Q.front();
        Q.pop();
 
        // Check if end of level is reached
        if (n == marker)
        {
            // print a new line and increment level number
            cout << endl;
            level++;
 
            // Check if marker node was last node in queue or
            // level number is beyond the given upper limit
            if (Q.empty() == true || level > high) break;
 
            // Enqueue the marker for end of next level
            Q.push(marker);
 
            // If this is marker, then we don't need print it
            // and enqueue its children
            continue;
        }
 
        // If level is equal to or greater than given lower level,
        // print it
        if (level >= low)
            cout << n->key << " ";
 
        // Enqueue children of non-marker node
        if (n->left != NULL)  Q.push(n->left);
        if (n->right != NULL) Q.push(n->right);
    }
}
 
/* Helper function that allocates a new Node with the
   given key and NULL left and right pointers. */
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return (temp);
}
 
/* Driver program to test above functions*/
int main()
{
    // Let us construct the BST shown in the above figure
    struct Node *root        = newNode(20);
    root->left               = newNode(8);
    root->right              = newNode(22);
    root->left->left         = newNode(4);
    root->left->right        = newNode(12);
    root->left->right->left  = newNode(10);
    root->left->right->right = newNode(14);
 
    cout << "Level Order traversal between given two levels is";
    printLevels(root, 2, 3);
 
    return 0;
}


Java




// Java program to print Nodes level by level between given two levels
import java.util.LinkedList;
import java.util.Queue;
  
/* A binary tree Node has key, pointer to left and right children */
class Node
{
    int data;
    Node left, right;
  
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
  
class BinaryTree
{
    Node root;
  
    /* Given a binary tree, print nodes from level number 'low' to level
       number 'high'*/
    void printLevels(Node node, int low, int high)
    {
        Queue<Node> Q = new LinkedList<>();
  
        Node  marker = new Node(4); // Marker node to indicate end of level
  
        int level = 1;   // Initialize level number
  
        // Enqueue the only first level node and marker node for end of level
        Q.add(node);
        Q.add(marker);
  
        // Simple level order traversal loop
        while (Q.isEmpty() == false)
        {
            // Remove the front item from queue
            Node  n = Q.peek();
            Q.remove();
  
            // Check if end of level is reached
            if (n == marker)
            {
                // print a new line and increment level number
                System.out.println("");
                level++;
  
                // Check if marker node was last node in queue or
                // level number is beyond the given upper limit
                if (Q.isEmpty() == true || level > high)
                    break;
  
                // Enqueue the marker for end of next level
                Q.add(marker);
                  
                // If this is marker, then we don't need print it
                // and enqueue its children
                continue;
            }
  
            // If level is equal to or greater than given lower level,
            // print it
            if (level >= low)
                System.out.print( n.data + " ");
 
            // Enqueue children of non-marker node
            if (n.left != null)
                Q.add(n.left);
             
            if (n.right != null)
                Q.add(n.right);
             
        }
    }
  
    // Driver program to test for above functions
    public static void main(String args[])
    {
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(20);
        tree.root.left = new Node(8);
        tree.root.right = new Node(22);
  
        tree.root.left.left = new Node(4);
        tree.root.left.right = new Node(12);
        tree.root.left.right.left = new Node(10);
        tree.root.left.right.right = new Node(14);
  
        System.out.print("Level Order traversal between given two levels is ");
        tree.printLevels(tree.root, 2, 3);
  
    }
}
  
// This code has been contributed by Mayank Jaiswal


Python3




# Python program to print nodes level by level between
# given two levels
 
# A binary tree node
class Node:
    # Constructor to create a new node
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
     
# Given a binary tree, print nodes form level number 'low'
# to level number 'high'
 
def printLevels(root, low, high):
    Q = []
     
    marker  = Node(11114) # Marker node to indicate end of level
     
    level = 1 # Initialize level number
 
    # Enqueue the only first level node and marker node for
    # end of level
    Q.append(root)
    Q.append(marker)
     
    #print Q
    # Simple level order traversal loop
    while(len(Q) >0):
        # Remove the front item from queue
        n = Q[0]
        Q.pop(0)
        #print Q
        # Check if end of level is reached
        if n == marker:
            # print a new line and increment level number
            print()
            level += 1
         
            # Check if marker node was last node in queue
            # or level number is beyond the given upper limit
            if len(Q) == 0 or level > high:
                break
             
            # Enqueue the marker for end of next level
            Q.append(marker)
             
            # If this is marker, then we don't need print it
            # and enqueue its children
            continue
        if level >= low:
                print (n.key,end=" ")
             
        # Enqueue children of non-marker node
        if n.left is not None:
            Q.append(n.left)
            Q.append(n.right)
 
# Driver program to test the above function
root = Node(20)
root.left = Node(8)
root.right = Node(22)
root.left.left = Node(4)
root.left.right = Node(12)
root.left.right.left = Node(10)
root.left.right.right = Node(14)
 
print ("Level Order Traversal between given two levels is",printLevels(root,2,3))
 
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)


C#




using System;
using System.Collections.Generic;
 
// c# program to print Nodes level by level between given two levels
 
/* A binary tree Node has key, pointer to left and right children */
public class Node
{
    public int data;
    public Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
public class BinaryTree
{
    public Node root;
 
    /* Given a binary tree, print nodes from level number 'low' to level
       number 'high'*/
    public virtual void printLevels(Node node, int low, int high)
    {
        LinkedList<Node> Q = new LinkedList<Node>();
 
        Node marker = new Node(4); // Marker node to indicate end of level
 
        int level = 1; // Initialize level number
 
        // Enqueue the only first level node and marker node for end of level
        Q.AddLast(node);
        Q.AddLast(marker);
 
        // Simple level order traversal loop
        while (Q.Count > 0)
        {
            // Remove the front item from queue
            Node n = Q.First.Value;
            Q.RemoveFirst();
 
            // Check if end of level is reached
            if (n == marker)
            {
                // print a new line and increment level number
                Console.WriteLine("");
                level++;
 
                // Check if marker node was last node in queue or
                // level number is beyond the given upper limit
                if (Q.Count == 0 || level > high)
                {
                    break;
                }
 
                // Enqueue the marker for end of next level
                Q.AddLast(marker);
 
                // If this is marker, then we don't need print it
                // and enqueue its children
                continue;
            }
 
            // If level is equal to or greater than given lower level,
            // print it
            if (level >= low)
            {
                Console.Write(n.data + " ");
            }
 
            // Enqueue children of non-marker node
            if (n.left != null)
            {
                Q.AddLast(n.left);
            }
 
            if (n.right != null)
            {
                Q.AddLast(n.right);
            }
 
        }
    }
 
    // Driver program to test for above functions
    public static void Main(string[] args)
    {
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(20);
        tree.root.left = new Node(8);
        tree.root.right = new Node(22);
 
        tree.root.left.left = new Node(4);
        tree.root.left.right = new Node(12);
        tree.root.left.right.left = new Node(10);
        tree.root.left.right.right = new Node(14);
 
        Console.Write("Level Order traversal between given two levels is ");
        tree.printLevels(tree.root, 2, 3);
 
    }
}
 
// This code is contributed by Shrikant13


Javascript




<script>
  
// JavaScript program to print Nodes
// level by level between given two levels
 
/* A binary tree Node has key, pointer to
left and right children */
class Node
{
  constructor(item)
  {
    this.data = item;
    this.left = null;
    this.right = null;
  }
}
 
var root = null;
/* Given a binary tree, print nodes
from level number 'low' to level
   number 'high'*/
function printLevels(node, low, high)
{
    var Q = [];
    var marker = new Node(4); // Marker node to indicate end of level
    var level = 1; // Initialize level number
    // Enqueue the only first level node and
    // marker node for end of level
    Q.push(node);
    Q.push(marker);
    // Simple level order traversal loop
    while (Q.length > 0)
    {
        // Remove the front item from queue
        var n = Q[0];
        Q.shift();
        // Check if end of level is reached
        if (n == marker)
        {
            // print a new line and increment level number
            document.write("<br>");
            level++;
            // Check if marker node was last node in queue or
            // level number is beyond the given upper limit
            if (Q.length == 0 || level > high)
            {
                break;
            }
            // Enqueue the marker for end of next level
            Q.push(marker);
            // If this is marker, then we don't need print it
            // and enqueue its children
            continue;
        }
        // If level is equal to or greater than given lower level,
        // print it
        if (level >= low)
        {
            document.write(n.data + " ");
        }
        // Enqueue children of non-marker node
        if (n.left != null)
        {
            Q.push(n.left);
        }
        if (n.right != null)
        {
            Q.push(n.right);
        }
    }
}
// Driver program to test for above functions
root = new Node(20);
root.left = new Node(8);
root.right = new Node(22);
root.left.left = new Node(4);
root.left.right = new Node(12);
root.left.right.left = new Node(10);
root.left.right.right = new Node(14);
document.write("Level Order traversal between given two levels is ");
printLevels(root, 2, 3);
 
</script>


Output

Level Order traversal between given two levels is
8 22 
4 12 

Time complexity of above method is O(n) as it does a simple level order traversal. 
Auxiliary Space: O(N) where N is the number of nodes in the binary tree due to queue.



Last Updated : 12 Jan, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads