Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • DSA
  • Interview Problems on Tree
  • Practice Tree
  • MCQs on Tree
  • Tutorial on Tree
  • Types of Trees
  • Basic operations
  • Tree Traversal
  • Binary Tree
  • Complete Binary Tree
  • Ternary Tree
  • Binary Search Tree
  • Red-Black Tree
  • AVL Tree
  • Full Binary Tree
  • B-Tree
  • Advantages & Disadvantages
Open In App
Next Article:
Maximum width of a Binary Tree with null values | Set 2
Next article icon

Find the Level of a Binary Tree with Width K

Last Updated : 22 Jun, 2021
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a Binary Tree and an integer K, the task is to find the level of the Binary Tree with width K. If multiple levels exists with width K, print the lowest level. If no such level exists, print -1.

The width of a level of a Binary tree is defined as the number of nodes between leftmost and the rightmost node at that level, including the NULL nodes in between them as well.

Examples:

Input: K = 4  

          5  --------- 1st level width = 1 => (5)         /   \        6     2 -------- 2nd level width = 2 => (6, 2)       / \     \        7   3     8 -------3rd level width = 4 => (7, 3, NULL, 8)     /     \    5       4  -----------4th level width = 4 => (5, NULL, NULL, 4)

Output: 3 
Explanation: 
For the given tree, the levels having width K( = 4) are 3 and 4. 
Since 3 is the minimum of the two, print the minimum.

Input: K = 7 

           1  --------- 1st level width = 1 => (1)          /   \         2     9 -------- 2nd level width = 2 => (2, 9)        /       \         7         8 ---------3rd level width = 4 => (7, NULL, NULL, 8)      /         /     5         9 -----------4th level width = 7 => (5, NULL, NULL,               /                                NULL, NULL, NULL, 9)             2  -----------5th level width = 1 => (2)            /           1  -----------6th level width = 1 => (1)

Output: 4 
Explanation: 
For the given tree, the level having width K( = 7) is 4.  

Approach:  
The basic idea to solve the problem is to add a label to each node. If a parent has a label i, then assign a label 2*i to it's left child and 2*i+1 to its right child. This will help in including the NULL nodes in the calculation. 
Follow the steps below: 

  • Perform Level Order Traversal on the given tree using a Queue.
  • Queue contains a pair of {Node, Label}. Initially insert {rootNode, 0} to queue.
  • If parent has label i, then for a left child, insert {leftChild, 2*i} to queue and for right child, insert{rightChild, 2*i+1} into the queue.
  • For each level assume a as label of leftmost node and b as label of rightmost node, then (b-a+1) gives the width of that level.
  • Check whether the width is equal to K. If so, return level.
  • If none of the levels have width K, then return -1.

Below is the implementation of the above approach:

C++
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std;  // Structure of a Tree node struct Node {     int key;     struct Node *left, *right; };  // Utility function to create // and initialize a new node Node* newNode(int key) {     Node* temp = new Node;     temp->key = key;     temp->left = temp->right = NULL;     return (temp); }  // Function returns required level // of width k, if found else -1 int findLevel(Node* root,               int k, int level) {      // To store the node and the label     // and perform traversal     queue<pair<Node*, int> > qt;     qt.push(make_pair(root, 0));      int count = 1, b, a = 0;      while (!qt.empty()) {          pair<Node*, int> temp = qt.front();         qt.pop();          // Taking the last label         // of each level of the tree         if (count == 1) {             b = temp.second;         }          if ((temp.first)->left) {             qt.push(make_pair(                 temp.first->left,                 2 * temp.second));         }         if (temp.first->right) {             qt.push(make_pair(                 temp.first->right,                 2 * temp.second + 1));         }          count--;          // Check width of current level         if (count == 0) {              // If the width is equal to k             // then return that level             if (b - a + 1 == k)                 return level;              pair<Node*, int> secondLabel = qt.front();              // Taking the first label             // of each level of the tree             a = secondLabel.second;              level += 1;             count = qt.size();         }     }      // If any level does not has     // width equal to k, return -1     return -1; }  // Driver Code int main() {     Node* root = newNode(5);     root->left = newNode(6);     root->right = newNode(2);     root->right->right = newNode(8);      root->left->left = newNode(7);     root->left->left->left = newNode(5);     root->left->right = newNode(3);     root->left->right->right = newNode(4);      int k = 4;      cout << findLevel(root, k, 1) << endl;      return 0; } 
Java
// Java program to implement  // the above approach  import java.util.*;  class GFG{  // Structure of // binary tree node static class Node {     int data;     Node left, right; };  static class pair  {     Node first;     int second;      pair(Node first, int second)     {         this.first = first;         this.second = second;     } }  // Function to create new node static Node newNode(int data) {     Node temp = new Node();     temp.data = data;     temp.left = temp.right = null;     return temp; }  // Function returns required level // of width k, if found else -1 static int findLevel(Node root,                      int k, int level) {      // To store the node and the label     // and perform traversal     Queue<pair> qt = new LinkedList<>();     qt.add(new pair(root, 0));      int count = 1, b = 0, a = 0;      while (!qt.isEmpty())      {         pair temp = qt.peek();         qt.poll();          // Taking the last label         // of each level of the tree         if (count == 1)          {             b = temp.second;         }          if (temp.first.left != null)          {             qt.add(new pair(                 temp.first.left,                 2 * temp.second));         }         if (temp.first.right != null)          {             qt.add(new pair(                 temp.first.right,                 2 * temp.second + 1));         }          count--;          // Check width of current level         if (count == 0)          {                          // If the width is equal to k             // then return that level             if ((b - a + 1) == k)                 return level;              pair secondLabel = qt.peek();              // Taking the first label             // of each level of the tree             a = secondLabel.second;              level += 1;             count = qt.size();         }     }      // If any level does not has     // width equal to k, return -1     return -1; }  // Driver code public static void main(String[] args) {     Node root = newNode(5);     root.left = newNode(6);     root.right = newNode(2);     root.right.right = newNode(8);      root.left.left = newNode(7);     root.left.left.left = newNode(5);     root.left.right = newNode(3);     root.left.right.right = newNode(4);      int k = 4;      System.out.println(findLevel(root, k, 1)); } }  // This code is contributed by offbeat 
Python3
# Python3 program to implement # the above approach from collections import deque  # Structure of a Tree node class Node:          def __init__(self, key):                  self.key = key         self.left = None         self.right = None  # Function returns required level # of width k, if found else -1 def findLevel(root: Node,                   k: int, level: int) -> int:      # To store the node and the label     # and perform traversal     qt = deque()     qt.append([root, 0])      count = 1     b = 0     a = 0      while qt:         temp = qt.popleft()          # Taking the last label         # of each level of the tree         if (count == 1):             b = temp[1]          if (temp[0].left):             qt.append([temp[0].left,                     2 * temp[1]])          if (temp[0].right):             qt.append([temp[0].right,                     2 * temp[1] + 1])          count -= 1          # Check width of current level         if (count == 0):              # If the width is equal to k             # then return that level             if (b - a + 1 == k):                 return level              secondLabel = qt[0]              # Taking the first label             # of each level of the tree             a = secondLabel[1]              level += 1             count = len(qt)      # If any level does not has     # width equal to k, return -1     return -1  # Driver Code if __name__ == "__main__":      root = Node(5)     root.left = Node(6)     root.right = Node(2)     root.right.right = Node(8)      root.left.left = Node(7)     root.left.left.left = Node(5)     root.left.right = Node(3)     root.left.right.right = Node(4)      k = 4      print(findLevel(root, k, 1))  # This code is contributed by sanjeev2552 
C#
// C# program to implement  // the above approach  using System; using System.Collections; using System.Collections.Generic;   class GFG{   // Structure of // binary tree node class Node {     public int data;     public Node left, right; };   class pair  {     public Node first;     public int second;       public pair(Node first, int second)     {         this.first = first;         this.second = second;     } }   // Function to create new node static Node newNode(int data) {     Node temp = new Node();     temp.data = data;     temp.left = temp.right = null;     return temp; }   // Function returns required level // of width k, if found else -1 static int findLevel(Node root,                      int k, int level) {       // To store the node and the label     // and perform traversal     Queue qt = new Queue();     qt.Enqueue(new pair(root, 0));       int count = 1, b = 0, a = 0;       while (qt.Count!=0)      {         pair temp = (pair)qt.Dequeue();                    // Taking the last label         // of each level of the tree         if (count == 1)          {             b = temp.second;         }           if (temp.first.left != null)          {             qt.Enqueue(new pair(                 temp.first.left,                 2 * temp.second));         }         if (temp.first.right != null)          {             qt.Enqueue(new pair(                 temp.first.right,                 2 * temp.second + 1));         }           count--;           // Check width of current level         if (count == 0)          {                           // If the width is equal to k             // then return that level             if ((b - a + 1) == k)                 return level;               pair secondLabel = (pair)qt.Peek();               // Taking the first label             // of each level of the tree             a = secondLabel.second;               level += 1;             count = qt.Count;         }     }       // If any level does not has     // width equal to k, return -1     return -1; }   // Driver code public static void Main(string[] args) {     Node root = newNode(5);     root.left = newNode(6);     root.right = newNode(2);     root.right.right = newNode(8);       root.left.left = newNode(7);     root.left.left.left = newNode(5);     root.left.right = newNode(3);     root.left.right.right = newNode(4);       int k = 4;       Console.Write(findLevel(root, k, 1)); } }  // This code is contributed by rutvik_56 
JavaScript
<script>  // Javascript program to implement  // the above approach    // Structure of // binary tree node class Node {     constructor()     {         this.data = 0;         this.left = null;         this.right = null;     } };   class pair  {     constructor(first, second)     {         this.first = first;         this.second = second;     } }   // Function to create new node function newNode(data) {     var temp = new Node();     temp.data = data;     temp.left = temp.right = null;     return temp; }   // Function returns required level // of width k, if found else -1 function findLevel(root, k, level) {       // To store the node and the label     // and perform traversal     var qt = [];     qt.push(new pair(root, 0));       var count = 1, b = 0, a = 0;       while (qt.length!=0)      {         var temp = qt.shift();                    // Taking the last label         // of each level of the tree         if (count == 1)          {             b = temp.second;         }           if (temp.first.left != null)          {             qt.push(new pair(                 temp.first.left,                 2 * temp.second));         }         if (temp.first.right != null)          {             qt.push(new pair(                 temp.first.right,                 2 * temp.second + 1));         }           count--;           // Check width of current level         if (count == 0)          {                           // If the width is equal to k             // then return that level             if ((b - a + 1) == k)                 return level;               var secondLabel = qt[0];               // Taking the first label             // of each level of the tree             a = secondLabel.second;               level += 1;             count = qt.length;         }     }       // If any level does not has     // width equal to k, return -1     return -1; }   // Driver code var root = newNode(5); root.left = newNode(6); root.right = newNode(2); root.right.right = newNode(8);  root.left.left = newNode(7); root.left.left.left = newNode(5); root.left.right = newNode(3); root.left.right.right = newNode(4);  var k = 4;  document.write(findLevel(root, k, 1));   </script>  

Output: 
3

 

Time Complexity : O(N) 
Auxiliary Space : O(N)
 


Next Article
Maximum width of a Binary Tree with null values | Set 2

A

arpit7714
Improve
Article Tags :
  • Tree
  • Searching
  • Data Structures
  • DSA
  • Tree Traversals
  • cpp-queue
Practice Tags :
  • Data Structures
  • Searching
  • Tree

Similar Reads

  • Maximum width of a Binary Tree with null value
    Given a Binary Tree consisting of N nodes, the task is to find the maximum width of the given tree where the maximum width is defined as the maximum of all the widths at each level of the given Tree. The width of a tree for any level is defined as the number of nodes between the two extreme nodes of
    11 min read
  • Maximum width of a Binary Tree with null values | Set 2
    Pre-requisite: Maximum width of a Binary Tree with null value | Set 1 Given a Binary Tree consisting of N nodes, the task is to find the maximum width of the given tree without using recursion, where the maximum width is defined as the maximum of all the widths at each level of the given Tree. Note:
    8 min read
  • Level of a Node in Binary Tree
    Given a Binary Tree and a key, the task is to find the level of key in the Binary Tree. Examples: Input : key = 4 Output: 3Explanation: The level of the key in above binary tree is 3.Input : key = 10 Output: -1Explanation: Key is not present in the above Binary tree. Table of Content [Expected Appro
    12 min read
  • Nodes at Kth level without duplicates in a Binary Tree
    Given a binary tree with N nodes and an integer K, the task is to print nodes of the Kth level of a binary tree without duplicates. Examples: Input: 60 --- Level 0 / \ 50 30 --- Level 1 / \ / 80 10 40 --- Level 2 K = 1 Output: 30 50 Input: 50 --- Level 0 / \ 60 70 --- Level 1 / \ / \ 90 40 40 20 ---
    11 min read
  • Find the closest leaf in a Binary Tree
    Given a Binary Tree and a key 'k', find distance of the closest leaf from 'k'. Examples: A / \ B C / \ E F / \ G H / \ / I J K Closest leaf to 'H' is 'K', so distance is 1 for 'H' Closest leaf to 'C' is 'B', so distance is 2 for 'C' Closest leaf to 'E' is either 'I' or 'J', so distance is 2 for 'E'
    14 min read
  • Maximum width of a Binary Tree
    Given a binary tree, the task is to find the maximum width of the given tree. The width of a tree is the maximum of the widths of all levels. Before solving the problem first, let us understand what we have to do. Binary trees are one of the most common types of trees in computer science. They are a
    15+ min read
  • Count nodes with two children at level L in a Binary Tree
    Given a Binary tree, the task is to count the number of nodes with two children at a given level L. Examples: Input: 1 / \ 2 3 / \ \ 4 5 6 / / \ 7 8 9 L = 2 Output: 1 Input: 20 / \ 8 22 / \ / \ 5 3 4 25 / \ / \ \ 1 10 2 14 6 L = 3 Output: 2 Approach: Initialize a variable count = 0. Recursively trav
    13 min read
  • Print all Nodes of given Binary Tree at the Kth Level
    Given a binary tree and an integer K, the task is to print all the integers at the Kth level in the tree from left to right. Examples: Input: Tree in the image below, K = 3 Output: 4 5 6Explanation: All the nodes present in level 3 of above binary tree from left to right are 4, 5, and 6. Input: Tree
    5 min read
  • Check if a binary tree is sorted level-wise or not
    Given a binary tree. The task is to check if the binary tree is sorted level-wise or not. A binary tree is level sorted if max( i-1th level) is less than min( ith level ). Examples: Input : 1 / \ / \ 2 3 / \ / \ / \ / \ 4 5 6 7 Output : Sorted Input: 1 / 4 / \ 6 5 \ 2 Output: Not sorted Simple Solut
    10 min read
  • Print all K-sum levels in a Binary Tree
    Given a Binary Tree and an integer K where the tree has positive and negative nodes, the task is to print the elements of the level whose sum equals K. If no such result exists, then print "Not Possible". Examples: Input: -10 / \ 2 -3 / \ \ 4 15 -6 / \ / 7 -8 9 K = 13 Output: 4 15 -6 Explanation: Le
    8 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences