Check if a given Binary Tree is Heap - GeeksforGeeks
Given a binary tree we need to check it has heap property or not, Binary tree need to fulfill following two conditions for being a heap –
Detail about isComplete function can be found here.
Check whether a given Binary Tree is Complete or not
1. Level Order Traversal
2.
 
 
 
 
 
 
 
Read full article from Check if a given Binary Tree is Heap - GeeksforGeeks
Given a binary tree we need to check it has heap property or not, Binary tree need to fulfill following two conditions for being a heap –
- It should be a complete tree (i.e. all levels except last should be full).
- Every node's value should be greater than or equal to its child node (considering max-heap).
Detail about isComplete function can be found here.
Check whether a given Binary Tree is Complete or not
1. Level Order Traversal
2.
- Calculate the number of nodes (count) in the binary tree.
- Start recursion of the binary tree from the root node of the binary tree with index (i) being set as 0 and the number of nodes in the binary (count).
- If the current node under examination is NULL, then the tree is a complete binary tree. Return true.
- If index (i) of the current node is greater than or equal to the number of nodes in the binary tree (count) i.e. (i>= count), then the tree is not a complete binary. Return false.
- Recursively check the left and right sub-trees of the binary tree for same condition. For the left sub-tree use the index as (2*i + 1) while for the right sub-tree use the index as (2*i + 2).
/* This function counts the number of nodes in a binary tree */unsigned int countNodes(struct Node* root){    if (root == NULL)        return (0);    return (1 + countNodes(root->left) + countNodes(root->right));}/* This function checks if the binary tree is complete or not */bool isCompleteUtil (struct Node* root, unsigned int index,                     unsigned int number_nodes){    // An empty tree is complete    if (root == NULL)        return (true);    // If index assigned to current node is more than    // number of nodes in tree, then tree is not complete    if (index >= number_nodes)        return (false);    // Recur for left and right subtrees    return (isCompleteUtil(root->left, 2*index + 1, number_nodes) &&            isCompleteUtil(root->right, 2*index + 2, number_nodes));}// This Function checks the heap property in the tree.bool isHeapUtil(struct Node* root){    //  Base case : single node satisfies property    if (root->left == NULL && root->right == NULL)        return (true);    //  node will be in second last level    if (root->right == NULL)    {        //  check heap property at Node        //  No recursive call , because no need to check last level        return (root->key >= root->left->key);    }    else    {        //  Check heap property at Node and        //  Recursive check heap property at left and right subtree        if (root->key >= root->left->key &&            root->key >= root->right->key)            return ((isHeapUtil(root->left)) &&                    (isHeapUtil(root->right)));        else            return (false);    }}//  Function to check binary tree is a Heap or Not.bool isHeap(struct Node* root){    // These two are used in isCompleteUtil()    unsigned int node_count = countNodes(root);    unsigned int index = 0;    if (isCompleteUtil(root, index, node_count) && isHeapUtil(root))        return true;    return false;}