Last Updated on December 14, 2022 by Prepbytes
Problem Statement:
Given a binary tree, our task is to check whether the given tree follows the max heap property or not.
What is a Binary Tree?
Binary tree is a type of Tree data structure in which every node in the tree will have 2 or less than 2 child nodes and those child nodes will be termed as the left child and the right child of the node.
What is a Max-Heap?
Max – Heap follows the property of a complete binary tree in which the value of the internal node is greater than or equal to the value of the children of that node.
Examples of Max Heap:
There are two conditions that should be fulfilled for satisfying the max-heap property:
- It must be a complete binary tree, i.e. except for the last level of the tree, all other levels must be fully filled with nodes.
- The value of every node must be greater than or equal to their children. (condition for max – heap).
We have to check the above conditions separately, we build the is_complete_tree function for checking whether the tree is a complete binary tree or not, and is_heap_property for checking the max – heap properties.
Following will be the procedure for implementing the Is_complete_tree function:
- Firstly, calculate the number of nodes in the binary tree.
- Make the recursion call from the root of the binary tree with index i having an initial value of 0, and the count of nodes present in the binary tree.
- If the current node is NULL, then the given tree is a complete binary tree.
- If the ith index of the current node is greater than or equal to the number of nodes present in the binary tree, then it is not a complete binary tree and returns false.
- Check recursively for the left and right sub – tree for the same conditions. For the left sub – tree change the value of the index to (2 i + 1) and for the right subtree change the value of the index to (2 i + 2).
Following will be the procedure for implementing the is_heap_property function:
- Every node can have 2 child nodes, 0 child nodes (if it is a leaf node), or 1 child node (it is only possible for at most 1 such node).
- If there is no child node present for the given node, then return true.
- If the node has 1 child node, it must be the left child node for following the complete binary tree condition. We have to compare the given node to its single child node only.
- If there are 2 child nodes present for the given node, then check the heap property at the node at recursion for both sub-trees.
Code Implementation
#include <stdbool.h> #include <stdio.h> #include <stdlib.h> struct Node { int key; struct Node* left; struct Node* right; }; struct Node* newNode(int k) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->key = k; node->right = node->left = NULL; return node; } unsigned int countNodes(struct Node* root) { if (root == NULL) return (0); return (1 + countNodes(root->left) + countNodes(root->right)); } bool isCompleteUtil(struct Node* root, unsigned int index, unsigned int number_nodes) { if (root == NULL) return (true); if (index >= number_nodes) return (false); return (isCompleteUtil(root->left, 2 * index + 1, number_nodes) && isCompleteUtil(root->right, 2 * index + 2, number_nodes)); } bool isHeapUtil(struct Node* root) { if (root->left == NULL && root->right == NULL) return (true); if (root->right == NULL) { return (root->key >= root->left->key); } else { if (root->key >= root->left->key && root->key >= root->right->key) return ((isHeapUtil(root->left)) && (isHeapUtil(root->right))); else return (false); } } bool isHeap(struct Node* root) { unsigned int node_count = countNodes(root); unsigned int index = 0; if (isCompleteUtil(root, index, node_count) && isHeapUtil(root)) return true; return false; } int main() { struct Node* root = NULL; root = newNode(10); root->left = newNode(9); root->right = newNode(8); root->left->left = newNode(7); root->left->right = newNode(6); root->right->left = newNode(5); root->right->right = newNode(4); root->left->left->left = newNode(3); root->left->left->right = newNode(2); root->left->right->left = newNode(1); if (isHeap(root)) printf("Given Binary Tree is a Max-Heap\n"); else printf("Given Binary Tree is not a Max-Heap\n"); return 0; }
#include <bits/stdc++.h> using namespace std; struct Node { int key; struct Node *left; struct Node *right; }; struct Node *newNode(int k) { struct Node *node = new Node; node->key = k; node->right = node->left = NULL; return node; } unsigned int countNodes(struct Node* root) { if (root == NULL) return (0); return (1 + countNodes(root->left) + countNodes(root->right)); } bool is_complete_tree (struct Node* root, unsigned int index, unsigned int number_nodes) { if (root == NULL) return (true); if (index >= number_nodes) return (false); return (is_complete_tree(root->left, 2*index + 1, number_nodes) && is_complete_tree(root->right, 2*index + 2, number_nodes)); } bool is_heap_property(struct Node* root) { if (root->left == NULL && root->right == NULL) return (true); if (root->right == NULL) { return (root->key >= root->left->key); } else { if (root->key >= root->left->key && root->key >= root->right->key) return ((is_heap_property(root->left)) && (is_heap_property(root->right))); else return (false); } } bool isHeap(struct Node* root) { unsigned int node_count = countNodes(root); unsigned int index = 0; if (is_complete_tree(root, index, node_count) && is_heap_property(root)) return true; return false; } int main() { struct Node* root = NULL; root = newNode(25); root->left = newNode(11); root->right = newNode(16); root->left->left = newNode(3); root->left->right = newNode(8); if (isHeap(root)) cout << "Given Binary Tree is a Max - Heap\n"; else cout << "Given Binary Tree is not a Max - Heap\n"; return 0; }
class Node { int key; Node left, right; Node(int k) { key = k; left = right = null; } } class Is_BinaryTree_MaxHeap { int countNodes(Node root) { if (root == null) return 0; return (1 + countNodes(root.left) + countNodes(root.right)); } boolean isCompleteUtil(Node root, int index, int number_nodes) { if (root == null) return true; if (index >= number_nodes) return false; return isCompleteUtil(root.left, 2 * index + 1, number_nodes) && isCompleteUtil(root.right, 2 * index + 2, number_nodes); } boolean isHeapUtil(Node root) { if (root.left == null && root.right == null) return true; if (root.right == null) { return root.key >= root.left.key; } else { if (root.key >= root.left.key && root.key >= root.right.key) return isHeapUtil(root.left) && isHeapUtil(root.right); else return false; } } boolean isHeap(Node root) { if (root == null) return true; int node_count = countNodes(root); if (isCompleteUtil(root, 0, node_count) == true && isHeapUtil(root) == true) return true; return false; } public static void main(String args[]) { Is_BinaryTree_MaxHeap bt = new Is_BinaryTree_MaxHeap(); Node root = new Node(10); root.left = new Node(9); root.right = new Node(8); root.left.left = new Node(7); root.left.right = new Node(6); root.right.left = new Node(5); root.right.right = new Node(4); root.left.left.left = new Node(3); root.left.left.right = new Node(2); root.left.right.left = new Node(1); if (bt.isHeap(root) == true) System.out.println( "Given Binary Tree is a Max-Heap"); else System.out.println( "Given Binary Tree is not a Max-Heap"); } }
class binary_tree: def __init__(self, value): self.key = value self.left = None self.right = None def count_nodes(self, root): if root is None: return 0 else: return (1 + self.count_nodes(root.left) + self.count_nodes(root.right)) def is_heap_property(self, root): if (root.left is None and root.right is None): return True if root.right is None: return root.key >= root.left.key else: if (root.key >= root.left.key and root.key >= root.right.key): return (self.is_heap_property(root.left) and self.is_heap_property(root.right)) else: return False def is_complete_tree(self, root, index, node_count): if root is None: return True if index >= node_count: return False return (self.is_complete_tree(root.left, 2 * index + 1, node_count) and self.is_complete_tree(root.right, 2 * index + 2, node_count)) def isHeap(self): node_count = self.count_nodes(self) if (self.is_complete_tree(self, 0, node_count) and self.is_heap_property(self)): return True else: return False root = binary_tree(25) root.left = binary_tree(11) root.right = binary_tree(16) root.left.left = binary_tree(3) root.left.right = binary_tree(8) if root.isHeap(): print("Given Binary Tree is a Max - Heap") else: print("Given Binary Tree is not a Max - Heap")
Output:
Given Binary Tree is a Max-Heap
This article tried to discuss How to Check if a given Binary Tree is Heap. Hope this blog helps you understand the concept. To practice more problems feel free to check MYCODE | Competitive Programming at Prepbytes.