All nodes between two given levels in Binary Tree (original) (raw)
Last Updated : 11 May, 2025
Given a binary tree, the task is to print all nodes between two given levels in a binary tree. Print the nodes level-wise, i.e., the nodes for any level should be printed from left to right.
**Note: The levels are 1-indexed, i.e., root node is at level 1.
**Example:
**Input: Binary tree, l = 2, h = 3
**Output:
2 3
4 5 6 7
Using Recursion - O(n) time and O(n) space
The idea is to perform a preorder traversal of the binary tree while keeping track of the current level.
Step by step approach:
- Maintain a result array of arrays to store nodes at each level.
- Traverse the tree recursively using preorder traversal (root, left, right).
- Track the current level during traversal.
- If current level is between low and high boundaries, add node to appropriate level in result.
- If needed, create a new vector for a level not yet encountered. C++ `
// C++ program to Print all nodes between // two given levels in Binary Tree #include <bits/stdc++.h> using namespace std;
class Node { public: int data; Node *left, *right; Node(int x) { data = x; left = nullptr; right = nullptr; } };
void preOrder(Node* root, int level, int l, int h, vector<vector>& res) { if (root == nullptr) return;
// If current level is within range, add to result
if (level >= l && level <= h) {
// Adjust index as our result array is 0-indexed
int idx = level - l;
// Make sure we have an array for this level
if (idx >= res.size()) {
res.push_back(vector<int>());
}
// Add current node's data to appropriate level
res[idx].push_back(root->data);
}
// Traverse left and right subtrees
preOrder(root->left, level + 1, l, h, res);
preOrder(root->right, level + 1, l, h, res);
}
vector<vector> printLevels(Node* root, int l, int h) { vector<vector> res; preOrder(root, 1, l, h, res); return res; }
int main() {
// 1
// / \
// 2 3
// / \ / \
// 4 5 6 7
// / \ / \ / \ / \
// 8 9 10 11 12 13 14 15
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->left = new Node(6);
root->right->right = new Node(7);
root->left->left->left = new Node(8);
root->left->left->right = new Node(9);
root->left->right->left = new Node(10);
root->left->right->right = new Node(11);
root->right->left->left = new Node(12);
root->right->left->right = new Node(13);
root->right->right->left = new Node(14);
root->right->right->right = new Node(15);
int l = 2, h = 3;
vector<vector<int>> res = printLevels(root, l, h);
for (auto v: res) {
for (auto node: v) cout << node << " ";
cout << endl;
}
return 0;
}
Java
// Java program to Print all nodes between // two given levels in Binary Tree
import java.util.ArrayList;
class Node { int data; Node left, right; Node(int x) { data = x; left = null; right = null; } }
class GfG {
// If current level is within range, add to result
static void preOrder(Node root, int level, int l,
int h, ArrayList<ArrayList<Integer>> res) {
if (root == null)
return;
if (level >= l && level <= h) {
// Adjust index as our result array is 0-indexed
int idx = level - l;
// Make sure we have an array for this level
if (idx >= res.size()) {
res.add(new ArrayList<>());
}
// Add current node's data to appropriate level
res.get(idx).add(root.data);
}
// Traverse left and right subtrees
preOrder(root.left, level + 1, l, h, res);
preOrder(root.right, level + 1, l, h, res);
}
static ArrayList<ArrayList<Integer>> printLevels(Node root, int l, int h) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
preOrder(root, 1, l, h, res);
return res;
}
public static void main(String[] args) {
// 1
// / \
// 2 3
// / \ / \
// 4 5 6 7
// / \ / \ / \ / \
// 8 9 10 11 12 13 14 15
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.left = new Node(6);
root.right.right = new Node(7);
root.left.left.left = new Node(8);
root.left.left.right = new Node(9);
root.left.right.left = new Node(10);
root.left.right.right = new Node(11);
root.right.left.left = new Node(12);
root.right.left.right = new Node(13);
root.right.right.left = new Node(14);
root.right.right.right = new Node(15);
int l = 2, h = 3;
ArrayList<ArrayList<Integer>> res = printLevels(root, l, h);
for (ArrayList<Integer> v : res) {
for (int node : v) System.out.print(node + " ");
System.out.println();
}
}
}
Python
Python program to Print all nodes between
two given levels in Binary Tree
class Node: def init(self, x): self.data = x self.left = None self.right = None
If current level is within range, add to result
def preOrder(root, level, l, h, res): if root is None: return
if level >= l and level <= h:
# Adjust index as our result array is 0-indexed
idx = level - l
# Make sure we have an array for this level
if idx >= len(res):
res.append([])
# Add current node's data to appropriate level
res[idx].append(root.data)
# Traverse left and right subtrees
preOrder(root.left, level + 1, l, h, res)
preOrder(root.right, level + 1, l, h, res)
def printLevels(root, l, h): res = [] preOrder(root, 1, l, h, res) return res
if name == "main":
# 1
# / \
# 2 3
# / \ / \
# 4 5 6 7
# / \ / \ / \ / \
# 8 9 10 11 12 13 14 15
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
root.left.left.left = Node(8)
root.left.left.right = Node(9)
root.left.right.left = Node(10)
root.left.right.right = Node(11)
root.right.left.left = Node(12)
root.right.left.right = Node(13)
root.right.right.left = Node(14)
root.right.right.right = Node(15)
l, h = 2, 3
res = printLevels(root, l, h)
for v in res:
for node in v:
print(node, end=" ")
print()
C#
// C# program to Print all nodes between // two given levels in Binary Tree
using System; using System.Collections.Generic;
class Node { public int data; public Node left, right; public Node(int x) { data = x; left = null; right = null; } }
class GfG {
// If current level is within range, add to result
static void preOrder(Node root, int level,
int l, int h, List<List<int>> res) {
if (root == null)
return;
if (level >= l && level <= h) {
// Adjust index as our result array is 0-indexed
int idx = level - l;
// Make sure we have an array for this level
if (idx >= res.Count) {
res.Add(new List<int>());
}
// Add current node's data to appropriate level
res[idx].Add(root.data);
}
// Traverse left and right subtrees
preOrder(root.left, level + 1, l, h, res);
preOrder(root.right, level + 1, l, h, res);
}
static List<List<int>> printLevels(Node root, int l, int h) {
List<List<int>> res = new List<List<int>>();
preOrder(root, 1, l, h, res);
return res;
}
static void Main(string[] args) {
// 1
// / \
// 2 3
// / \ / \
// 4 5 6 7
// / \ / \ / \ / \
// 8 9 10 11 12 13 14 15
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.left = new Node(6);
root.right.right = new Node(7);
root.left.left.left = new Node(8);
root.left.left.right = new Node(9);
root.left.right.left = new Node(10);
root.left.right.right = new Node(11);
root.right.left.left = new Node(12);
root.right.left.right = new Node(13);
root.right.right.left = new Node(14);
root.right.right.right = new Node(15);
int l = 2, h = 3;
List<List<int>> res = printLevels(root, l, h);
foreach (var v in res) {
foreach (var node in v)
Console.Write(node + " ");
Console.WriteLine();
}
}
}
JavaScript
// JavaScript program to Print all nodes between // two given levels in Binary Tree
class Node { constructor(x) { this.data = x; this.left = null; this.right = null; } }
// If current level is within range, add to result function preOrder(root, level, l, h, res) { if (root === null) return;
if (level >= l && level <= h) {
// Adjust index as our result array is 0-indexed
let idx = level - l;
// Make sure we have an array for this level
if (idx >= res.length) {
res.push([]);
}
// Add current node's data to appropriate level
res[idx].push(root.data);
}
// Traverse left and right subtrees
preOrder(root.left, level + 1, l, h, res);
preOrder(root.right, level + 1, l, h, res);
}
function printLevels(root, l, h) { let res = []; preOrder(root, 1, l, h, res); return res; }
// 1
// /
// 2 3
// / \ /
// 4 5 6 7
// / \ / \ / \ /
// 8 9 10 11 12 13 14 15
let 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.left = new Node(6);
root.right.right = new Node(7);
root.left.left.left = new Node(8);
root.left.left.right = new Node(9);
root.left.right.left = new Node(10);
root.left.right.right = new Node(11);
root.right.left.left = new Node(12);
root.right.left.right = new Node(13);
root.right.right.left = new Node(14);
root.right.right.right = new Node(15);
let l = 2, h = 3;
let res = printLevels(root, l, h); for (let v of res) { console.log(v.join(" ")); }
`
Using Level Order Traversal - O(n) time and O(n) space
Refer to Print nodes between two given levels - Level Order for detailed explanation and approach.