Print all the leaf nodes of Binary Heap - GeeksforGeeks

07 Apr, 2022
Given an array of N elements which denotes the array representation of binary heap, the task is to find the leaf nodes of this binary heap.
Examples: 
Input: 
arr[] = {1, 2, 3, 4, 5, 6, 7}
Output: 4 5 6 7
Explanation:
             1
           /   \
          2     3
         / \   / \
        4   5 6   7
Leaf nodes of the Binary Heap are:
4 5 6 7
         
Input: 
arr[] = {1, 2, 3, 4, 5,
         6, 7, 8, 9, 10}
Output: 6 7 8 9 10
Explanation:
                1
             /     \
            2       3
          /   \    / \
         4      5 6   7
       /   \   /
      8     9 10
Leaf Nodes of the Binary Heap are:
6 7 8 9 10
Approach: The key observation in the problem is that the every leaf node of the Binary  Heap will be at the Height H or H -1, If H is the height of the Binary Heap. Therefore, the leaf nodes can be computed as follows:
Calculate the total height of the binary heap.
Traverse the array in reverse order and compare the height of each node to the compute height H of the Binary Heap.
If the height of the current node is H, then add the current node to the leaf nodes.
Otherwise, If the height of current node is H-1 and there are no child nodes, then also add the node as leaf node.
Below is the implementation of the above approach:
Java
C#
Python3
Javascript
// Java implementation to print// the leaf nodes of a Binary Heap import java.lang.*;import java.util.*;class GFG {     // Function to calculate height    // of the Binary heap with given    // the count of the nodes    static int height(int N)    {        return (int)Math.ceil(                   Math.log(N + 1)                   / Math.log(2))            - 1;    }     // Function to find the leaf    // nodes of binary heap    static void findLeafNodes(        int arr[], int n)    {        // Calculate the height of        // the complete binary tree        int h = height(n);         ArrayList<Integer> arrlist            = new ArrayList<>();         for (int i = n - 1; i >= 0; i--) {            if (height(i + 1) == h) {                arrlist.add(arr[i]);            }            else if (height(i + 1) == h - 1                     && n <= ((2 * i) + 1)) {                 // if the height if h-1,                // then there should not                // be any child nodes                arrlist.add(arr[i]);            }            else {                break;            }        }        printLeafNodes(arrlist);    }     // Function to print the leaf nodes    static void printLeafNodes(        ArrayList<Integer> arrlist)    {        for (int i = arrlist.size() - 1;             i >= 0; i--) {            System.out.print(                arrlist.get(i) + " ");        }    }     // Driver Code    public static void main(String[] args)    {        int arr[] = { 1, 2, 3, 4, 5,                      6, 7, 8, 9, 10 };        findLeafNodes(arr, arr.length);    }}
// C# implementation to print// the leaf nodes of a Binary Heapusing System;using System.Collections.Generic;class GFG{ // Function to calculate height// of the Binary heap with given// the count of the nodesstatic int height(int N){    return (int)Math.Ceiling(                Math.Log(N + 1) /                Math.Log(2)) - 1;} // Function to find the leaf// nodes of binary heapstatic void findLeafNodes(int []arr,                          int n){    // Calculate the height of    // the complete binary tree    int h = height(n);     List<int> arrlist = new List<int>();     for (int i = n - 1; i >= 0; i--)    {        if (height(i + 1) == h)        {            arrlist.Add(arr[i]);        }        else if (height(i + 1) == h - 1 &&                 n <= ((2 * i) + 1))        {             // if the height if h-1,            // then there should not            // be any child nodes            arrlist.Add(arr[i]);        }        else        {            break;        }    }    printLeafNodes(arrlist);} // Function to print the leaf nodesstatic void printLeafNodes(List<int> arrlist){    for (int i = arrlist.Count - 1; i >= 0; i--)    {        Console.Write(arrlist[i] + " ");    }} // Driver Codepublic static void Main(String[] args){    int []arr = { 1, 2, 3, 4, 5,                  6, 7, 8, 9, 10 };    findLeafNodes(arr, arr.Length);}} // This code is contributed by Princi Singh
# Python3 implementation to print# the leaf nodes of a Binary Heapimport math def height(N):     return math.log(N + 1) // math.log(2)   # Function to find the leaf# nodes of binary heapdef findLeafNodes(arr, n):     # Calculate the height of    # the complete binary tree    h = height(n)         arrlist = []       for i in range(n - 1,-1,-1):        if (height(i + 1) == h):            arrlist.append(arr[i])        elif (height(i + 1) == h - 1 and n <= ((2 * i) + 1)):               # if the height if h-1,            # then there should not            # be any child nodes            arrlist.append(arr[i])        else:            break     prLeafNodes(arrlist)   # Function to pr the leaf nodesdef prLeafNodes(arrlist):     for i in range(len(arrlist) - 1,-1,-1):        print(arrlist[i],end=" ")   # Driver Codearr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]findLeafNodes(arr, len(arr)) # This code is contributed by shinjanpatra
<script>// JavaScript implementation to print// the leaf nodes of a Binary Heapfunction height(N){     return Math.floor(Math.log(N + 1) / Math.log(2))}   // Function to find the leaf// nodes of binary heapfunction findLeafNodes(arr, n){     // Calculate the height of    // the complete binary tree    let h = height(n)         let arrlist = []       for(let i = n - 1;i >= 0 ;i--){        if (height(i + 1) == h)            arrlist.push(arr[i])        else if (height(i + 1) == h - 1 && n <= ((2 * i) + 1))               // if the height if h-1,            // then there should not            // be any child nodes            arrlist.push(arr[i])        else            break    }     prLeafNodes(arrlist)}   // Function to pr the leaf nodesfunction prLeafNodes(arrlist){     for(let i = arrlist.length - 1 ; i>=-0; i--)        document.write(arrlist[i]," ")}   // Driver Code let arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]findLeafNodes(arr, arr.length) // This code is contributed by shinjanpatra </script>
6 7 8 9 10
Performance Analysis:
Time Complexity: O(L), where L is the number of leaf nodes.
Auxiliary Space: O(1)
princi singh
Akanksha_Rai
shinjanpatra
binary-representation
Data Structures-Heap
Arrays
Bit Magic
Heap
Arrays
Bit Magic
Heap
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Chocolate Distribution Problem
Reversal algorithm for array rotation
Window Sliding Technique
Next Greater Element
Find duplicates in O(n) time and O(1) extra space | Set 1
Bitwise Operators in C/C++
Left Shift and Right Shift Operators in C/C++
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Count set bits in an integer
How to swap two numbers without using a temporary variable?