How to check if a given array represents a Binary Heap?
Last Updated :
15 Dec, 2022
Given an array, how to check if the given array represents a Binary Max-Heap.
Examples:
Input: arr[] = {90, 15, 10, 7, 12, 2}
Output: True
The given array represents below tree
90
/ \
15 10
/ \ /
7 12 2
The tree follows max-heap property as every
node is greater than all of its descendants.
Input: arr[] = {9, 15, 10, 7, 12, 11}
Output: False
The given array represents below tree
9
/ \
15 10
/ \ /
7 12 11
The tree doesn't follows max-heap property 9 is
smaller than 15 and 10, and 10 is smaller than 11.
A Simple Solution is to first check root if it’s greater than all of its descendants. Then check for children of the root. Time complexity of this solution is O(n2)
An Efficient Solution is to compare root only with its children (not all descendants), if root is greater than its children and the same is true for all nodes, then tree is max-heap (This conclusion is based on transitive property of > operator, i.e., if x > y and y > z, then x > z).
The last internal node is present at index (n-2)/2 assuming that indexing begins with 0.
Below is the implementation of this solution.
C++
#include <limits.h>
#include <stdio.h>
bool isHeap( int arr[], int i, int n)
{
if (i >= (n - 1) / 2)
return true ;
if (arr[i] >= arr[2 * i + 1] &&
arr[i] >= arr[2 * i + 2]
&& isHeap(arr, 2 * i + 1, n)
&& isHeap(arr, 2 * i + 2, n))
return true ;
return false ;
}
int main()
{
int arr[] = { 90, 15, 10, 7, 12, 2, 7, 3 };
int n = sizeof (arr) / sizeof ( int ) - 1;
isHeap(arr, 0, n) ? printf ( "Yes" ) : printf ( "No" );
return 0;
}
|
Java
class GFG
{
static boolean isHeap( int arr[],
int i, int n)
{
if (i >= (n - 1 ) / 2 )
{
return true ;
}
if (arr[i] >= arr[ 2 * i + 1 ]
&& arr[i] >= arr[ 2 * i + 2 ]
&& isHeap(arr, 2 * i + 1 , n)
&& isHeap(arr, 2 * i + 2 , n))
{
return true ;
}
return false ;
}
public static void main(String[] args)
{
int arr[] = { 90 , 15 , 10 , 7 , 12 , 2 , 7 , 3 };
int n = arr.length - 1 ;
if (isHeap(arr, 0 , n)) {
System.out.println( "Yes" );
}
else {
System.out.println( "No" );
}
}
}
|
Python3
def isHeap(arr, i, n):
if i > = int ((n - 1 ) / 2 ):
return True
if (arr[i] > = arr[ 2 * i + 1 ] and
arr[i] > = arr[ 2 * i + 2 ] and
isHeap(arr, 2 * i + 1 , n) and
isHeap(arr, 2 * i + 2 , n)):
return True
return False
if __name__ = = '__main__' :
arr = [ 90 , 15 , 10 , 7 , 12 , 2 , 7 , 3 ]
n = len (arr) - 1
if isHeap(arr, 0 , n):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static bool isHeap( int []arr, int i, int n)
{
if (i >= (n - 1) / 2)
{
return true ;
}
if (arr[i] >= arr[2 * i + 1] &&
arr[i] >= arr[2 * i + 2] &&
isHeap(arr, 2 * i + 1, n) &&
isHeap(arr, 2 * i + 2, n))
{
return true ;
}
return false ;
}
public static void Main(String[] args)
{
int []arr = {90, 15, 10, 7, 12, 2, 7, 3};
int n = arr.Length-1;
if (isHeap(arr, 0, n))
{
Console.Write( "Yes" );
}
else
{
Console.Write( "No" );
}
}
}
|
PHP
<?php
function isHeap( $arr , $i , $n )
{
if ( $i >= ( $n - 1) / 2)
return true;
if ( $arr [ $i ] >= $arr [2 * $i + 1] &&
$arr [ $i ] >= $arr [2 * $i + 2] &&
isHeap( $arr , 2 * $i + 1, $n ) &&
isHeap( $arr , 2 * $i + 2, $n ))
return true;
return false;
}
$arr = array (90, 15, 10, 7, 12, 2, 7, 3);
$n = sizeof( $arr );
if (isHeap( $arr , 0, $n ))
echo "Yes" ;
else
echo "No" ;
?>
|
Javascript
<script>
function isHeap(arr,i,n)
{
if (i >= (n - 1) / 2)
{
return true ;
}
if (arr[i] >= arr[2 * i + 1]
&& arr[i] >= arr[2 * i + 2]
&& isHeap(arr, 2 * i + 1, n)
&& isHeap(arr, 2 * i + 2, n))
{
return true ;
}
return false ;
}
let arr=[ 90, 15, 10, 7, 12, 2, 7, 3 ];
let n = arr.length - 1;
if (isHeap(arr, 0, n)) {
document.write( "Yes<br>" );
}
else {
document.write( "No<br>" );
}
</script>
|
Time complexity: O(n)
Auxiliary Space: O(h), Here h is the height of the given tree and the extra space is used due to the recursion call stack.
An Iterative Solution is to traverse all internal nodes and check id the node is greater than its children or not.
C++
#include <stdio.h>
#include <limits.h>
bool isHeap( int arr[], int n)
{
for ( int i=0; i<=(n-2)/2; i++)
{
if (arr[2*i +1] > arr[i])
return false ;
if (2*i+2 < n && arr[2*i+2] > arr[i])
return false ;
}
return true ;
}
int main()
{
int arr[] = {90, 15, 10, 7, 12, 2, 7, 3};
int n = sizeof (arr) / sizeof ( int );
isHeap(arr, n)? printf ( "Yes" ): printf ( "No" );
return 0;
}
|
Java
class GFG {
static boolean isHeap( int arr[], int n) {
for ( int i = 0 ; i <= (n - 2 ) / 2 ; i++) {
if (arr[ 2 * i + 1 ] > arr[i]) {
return false ;
}
if ( 2 * i + 2 < n && arr[ 2 * i + 2 ] > arr[i]) {
return false ;
}
}
return true ;
}
public static void main(String[] args) {
int arr[] = { 90 , 15 , 10 , 7 , 12 , 2 , 7 , 3 };
int n = arr.length;
if (isHeap(arr, n)) {
System.out.println( "Yes" );
} else {
System.out.println( "No" );
}
}
}
|
Python3
def isHeap(arr, n):
for i in range ( int ((n - 2 ) / 2 ) + 1 ):
if arr[ 2 * i + 1 ] > arr[i]:
return False
if ( 2 * i + 2 < n and
arr[ 2 * i + 2 ] > arr[i]):
return False
return True
if __name__ = = '__main__' :
arr = [ 90 , 15 , 10 , 7 , 12 , 2 , 7 , 3 ]
n = len (arr)
if isHeap(arr, n):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static bool isHeap( int []arr, int n)
{
for ( int i = 0; i <= (n - 2) / 2; i++)
{
if (arr[2 * i + 1] > arr[i])
{
return false ;
}
if (2 * i + 2 < n && arr[2 * i + 2] > arr[i])
{
return false ;
}
}
return true ;
}
public static void Main()
{
int []arr = {90, 15, 10, 7, 12, 2, 7, 3};
int n = arr.Length;
if (isHeap(arr, n))
{
Console.Write( "Yes" );
}
else
{
Console.Write( "No" );
}
}
}
|
PHP
<?php
function isHeap( $arr , $i , $n )
{
for ( $i = 0; $i < (( $n - 2) / 2) + 1; $i ++)
{
if ( $arr [2 * $i + 1] > $arr [ $i ])
return False;
if (2 * $i + 2 < $n &&
$arr [2 * $i + 2] > $arr [ $i ])
return False;
return True;
}
}
$arr = array (90, 15, 10, 7, 12, 2, 7, 3);
$n = sizeof( $arr );
if (isHeap( $arr , 0, $n ))
echo "Yes" ;
else
echo "No" ;
?>
|
Javascript
<script>
function isHeap( arr, n)
{
for (let i=0; i<=Math.floor((n-2)/2); i++)
{
if (arr[2*i +1] > arr[i])
return false ;
if (2*i+2 < n && arr[2*i+2] > arr[i])
return false ;
}
return true ;
}
let arr = [90, 15, 10, 7, 12, 2, 7, 3];
let n = arr.length;
if (isHeap(arr, n)) {
document.write( "Yes" );
}
else {
document.write( "No" );
}
</script>
|
Time complexity: O(n), Where n is the total number of elements in the given array.
Auxiliary Space: O(1), As constant extra space is used.
Thanks to Himanshu for suggesting this solution.
Please Login to comment...