A Height Balanced Tree is tree where for each node this condition is true.
– The difference between heights of left subtree and right subtree for any node is not more than 1.So we can say that a tree T is Height Balanced when
– Left Sub Tree of T is height balanced
– Right Sub Tree of T is height balanced
and for each node this above condition is true :P
So now
Approach 1)
– Start from root.
– find height of Left and Right Subtree.
– If difference is <2
contiue
– else break
call same procedure for left and right child of node.Pseudo Code
– The difference between heights of left subtree and right subtree for any node is not more than 1.So we can say that a tree T is Height Balanced when
– Left Sub Tree of T is height balanced
– Right Sub Tree of T is height balanced
and for each node this above condition is true :P
So now
Approach 1)
– Start from root.
– find height of Left and Right Subtree.
– If difference is <2
contiue
– else break
call same procedure for left and right child of node.Pseudo Code
isHeightBalanced ( node root)
{
if (root==null) return 1;
lh = height ( root -> left )
rh = height ( root -> right )
if(lh-rh<2 || rh-lh<2) {
return 1 && ( isHeightBalanced ( root -> left ) && isHeightBalanced( root -> right ) )
}
else
return 0;
}
as Complexity of above code is O(n2) , { for each node recursively finding height and recursively finding height balacned }
We can think that while calculating height itself why not to find is a node is heightBalanced or not.
This would be topdown approch.
Approach 2)
bool isHeightBalanced(struct node *root, int* height)
{
int lh = 0, rh = 0;
int l = 0, r = 0;
if(root == NULL)
{
*height = 0;
return 1;
}//basecase
l = isBalanced(root->left, &lh);
r = isBalanced(root->right,&rh);
//call recursively
*height = (lh > rh? lh: rh) + 1;
if((lh - rh >= 2) || (rh - lh >= 2)) return 0;
else return l&&h;
}
//See *height is calculated and its reference would be either &lh or &rh
//Hence we calculated height of tree from root and specified lh/rh height for parent.
//so that lh-rh can be calculated easily
Code :
/* program to check if a tree is height-balanced or not */
#include<stdio.h>
#include<stdlib.h>
#define bool int
struct node
{
int data;
struct node* left;
struct node* right;
};
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
bool isBalanced(struct node *root, int* height)
{
int lh = 0, rh = 0;
int l = 0, r = 0;
if(root == NULL)
{
*height = 0;
return 1;
}
l = isBalanced(root->left, &lh);
r = isBalanced(root->right,&rh);
height = (lh > rh? lh: rh) + 1;
if((lh - rh >= 2) || (rh - lh >= 2))
return 0;
else return l&&r;
}
int main()
{
int height = 0;
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->right->left = newNode(6);
root->left->left->left = newNode(7);
if(isBalanced(root, &height))
printf("Tree is balanced");
else
printf("Tree is not balanced");
return 0;
}
See Working code at http://ideone.com/QTnTNe