Given an array arr[], determine whether it represents a valid binary max heap. Return true if it does; otherwise, return false.
Examples:
Input: arr[] = [90, 15, 10, 7, 12, 2] Output: true Explanation: 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 Explanation: The tree doesn't follows max-heap property 9 is smaller than 15 and 10, and 10 is smaller than 11.
[Naive Approach] Recursive Approach - O(n) Time and O(Log n) Space
We compare compare each node with its immediate children, not all descendants.
If every node is greater than or equal to its children, then by the transitive property (if x > y and y > z, then x > z), the whole tree satisfies the max-heap property.
The children of index i are at 2 i + 1 and 2 i + 2. A node will have children only if 2 i + 1 < n, which gives i ≤ (n − 2)/2. So, we traverse only up to index (n − 2)/2 because nodes after that are leaf nodes and do not have children, preventing out-of-bounds.
Algorithm:
Start from root and recursively check each node: it must be ≥ its left child (2i+1) and right child (2i+2).
Stop when reaching leaf nodes (i > (n-2)/2); if all checks pass, the array represents a max-heap.
C++
#include<iostream>#include<vector>usingnamespacestd;boolisHeapUtil(vector<int>&arr,inti,intn){// If leaf nodeif(i>=n/2)returntrue;intleft=2*i+1;intright=2*i+2;// Check left childif(arr[i]<arr[left])returnfalse;// Check right child only if existsif(right<n&&arr[i]<arr[right])returnfalse;// RecursereturnisHeapUtil(arr,left,n)&&(right>=n||isHeapUtil(arr,right,n));}boolisMaxHeap(vector<int>&arr){returnisHeapUtil(arr,0,arr.size());}intmain(){vector<int>arr={90,15,10,7,12,2,7,3};isMaxHeap(arr)?cout<<"true":cout<<"false";return0;}
Java
importjava.util.Arrays;classGfG{publicstaticbooleanisHeapUtil(int[]arr,inti,intn){// If leaf nodeif(i>=n/2)returntrue;intleft=2*i+1;intright=2*i+2;// Check left childif(arr[i]<arr[left])returnfalse;// Check right child only if existsif(right<n&&arr[i]<arr[right])returnfalse;// RecursereturnisHeapUtil(arr,left,n)&&(right>=n||isHeapUtil(arr,right,n));}publicstaticbooleanisMaxHeap(int[]arr){returnisHeapUtil(arr,0,arr.length);}publicstaticvoidmain(String[]args){int[]arr={90,15,10,7,12,2,7,3};System.out.println(isMaxHeap(arr)?"true":"false");}}
Python
defisHeapUtil(arr,i,n):# If leaf nodeifi>=n//2:returnTrueleft=2*i+1right=2*i+2# Check left childifarr[i]<arr[left]:returnFalse# Check right child only if existsifright<nandarr[i]<arr[right]:returnFalse# RecursereturnisHeapUtil(arr,left,n)and(right>=norisHeapUtil(arr,right,n))defisMaxHeap(arr):returnisHeapUtil(arr,0,len(arr))if__name__=="__main__":arr=list(map(int,input().split()))print("true"ifisMaxHeap(arr)else"false")
C#
usingSystem;classGfG{staticboolisHeapUtil(int[]arr,inti,intn){// If leaf nodeif(i>=n/2)returntrue;intleft=2*i+1;intright=2*i+2;// Check left childif(arr[i]<arr[left])returnfalse;// Check right child only if existsif(right<n&&arr[i]<arr[right])returnfalse;// RecursereturnisHeapUtil(arr,left,n)&&(right>=n||isHeapUtil(arr,right,n));}staticboolisMaxHeap(int[]arr){returnisHeapUtil(arr,0,arr.Length);}publicstaticvoidMain(){int[]arr={90,15,10,7,12,2,7,3};Console.WriteLine(isMaxHeap(arr)?"true":"false");}}
JavaScript
functionisHeapUtil(arr,i,n){// If leaf nodeif(i>=Math.floor(n/2))returntrue;letleft=2*i+1;letright=2*i+2;// Check left childif(arr[i]<arr[left])returnfalse;// Check right child only if existsif(right<n&&arr[i]<arr[right])returnfalse;// RecursereturnisHeapUtil(arr,left,n)&&(right>=n||isHeapUtil(arr,right,n));}functionisMaxHeap(arr){returnisHeapUtil(arr,0,arr.length);}// Driver codeletarr=[90,15,10,7,12,2,7,3];console.log(isMaxHeap(arr)?'true':'false');
Output
true
[Expected Approach] Iterative - O(n) Time and O(1) Space.
This is mainly an iterative version of the above recursive implementation. We traverse from 0 to index i ≤ (n − 2 ) / 2 because nodes beyond this point are leaf nodes and do not have any children. Indexes of children nodes of index i are 2 ∗ i + 1 and 2 ∗ i + 2
Algorithm:
Traverse all internal nodes (i = 0 to (n−2)/2) and check if each parent is ≥ its left (2 * i + 1) and right child (2 * i+ 2).
If any child is greater than its parent return false; otherwise, after full traversal, return true (valid max-heap).
C++
#include<iostream>#include<vector>usingnamespacestd;boolisMaxHeap(vector<int>&arr){intn=arr.size();// Traverse only internal nodesfor(inti=0;i<=(n-2)/2;i++){// Check left childif(arr[2*i+1]>arr[i])returnfalse;// Check right child (ensure index is valid)if(2*i+2<n&&arr[2*i+2]>arr[i])returnfalse;}returntrue;}intmain(){vector<int>arr={90,15,10,7,12,2,7,3};isMaxHeap(arr)?cout<<"true":cout<<"false";return0;}
Java
importjava.util.Arrays;publicclassMain{publicstaticbooleanisMaxHeap(int[]arr){intn=arr.length;// Traverse only internal nodesfor(inti=0;i<=(n-2)/2;i++){// Check left childif(arr[2*i+1]>arr[i])returnfalse;// Check right child (ensure index is valid)if(2*i+2<n&&arr[2*i+2]>arr[i])returnfalse;}returntrue;}publicstaticvoidmain(String[]args){int[]arr={90,15,10,7,12,2,7,3};if(isMaxHeap(arr))System.out.println("true");elseSystem.out.println("false");}}
Python
defisMaxHeap(arr):n=len(arr)# Traverse only internal nodesforiinrange(0,(n-2)//2+1):# Check left childifarr[2*i+1]>arr[i]:returnFalse# Check right child (ensure index is valid)if2*i+2<nandarr[2*i+2]>arr[i]:returnFalsereturnTrueif__name__=="__main__":arr=[90,15,10,7,12,2,7,3]print('true')ifisMaxHeap(arr)elseprint('false')
C#
usingSystem;usingSystem.Collections.Generic;classGfG{staticboolisMaxHeap(int[]arr){intn=arr.Length;// Traverse only internal nodesfor(inti=0;i<=(n-2)/2;i++){// Check left childif(arr[2*i+1]>arr[i])returnfalse;// Check right child (ensure index is valid)if(2*i+2<n&&arr[2*i+2]>arr[i])returnfalse;}returntrue;}publicstaticvoidMain(){int[]arr={90,15,10,7,12,2,7,3};Console.WriteLine(isMaxHeap(arr)?"true":"false");}}
JavaScript
functionisMaxHeap(arr){letn=arr.length;// Traverse only internal nodesfor(leti=0;i<=Math.floor((n-2)/2);i++){// Check left childif(arr[2*i+1]>arr[i])returnfalse;// Check right child (ensure index is valid)if(2*i+2<n&&arr[2*i+2]>arr[i])returnfalse;}returntrue;}letarr=[90,15,10,7,12,2,7,3];console.log(isMaxHeap(arr)?'true':'false');