In a height-balanced binary tree, the absolute difference of the height of the left sub-tree and the height of the right sub-tree is less than or equal to 1 at every node.
Steps to check if a binary tree is height-balanced :
Note : This is not an efficient method to check if a binary tree is height-balanced as we recursively find the height of the left and the right sub-tree of every node.Thus every node is visited twice; once while finding if its left and right sub-trees are height-balanced and once when it is a child node whose height needs to be found out.
An efficient approach is to use Tree Traversal which has a time complexity of O(N).
Examples of height balanced and height unbalanced trees
Time complexity : O ( N 2 ), where N is the number of nodes in the tree. We find the height of left and right sub-trees of every node in O(N) time as it is visited. Since there are ‘N’ nodes the time taken is O ( N * N ).
Program to check if a binary tree is height-balanced.
class Node:
def __init__(self, data, left = None, right = None):
self.left = left
self.right = right
self.data = data
class Tree:
def FindHeight (self, node):
if ( node == None ):
return 0
return (1 + max(self.FindHeight (node.left), self.FindHeight (node.right)))
def CheckIfHeightBalanced (self, root):
if (root == None):
return True
height_left_subtree = self.FindHeight (root.left)
height_right_subtree = self.FindHeight (root.right)
if (abs(height_left_subtree - height_right_subtree) > 1):
return False
return (self.CheckIfHeightBalanced (root.left) and self.CheckIfHeightBalanced (root.right))
def main():
""" Tree A is height-balanced.
11
/ \ ----- height 0
height 1--- 22
"""
node22 = Node(22)
root_node11 = Node(11, node22, None)
""" Tree B is height-balanced.
1
/ \
height 1----2 3
/ \
4 5 ----- height 2
"""
node2 = Node(2)
node4 = Node(4)
node5 = Node(5)
node3 = Node(3, node4, node5)
root_node1 = Node(1, node2, node3)
""" Tree C is not height-balanced as height difference is abs(1-3) = 2.
10
/ \
height 1--- 20 30
/ \
70 40
/ \
50 60 ------- height 3
"""
node20 = Node(20)
node70 = Node(70)
node50 = Node(50)
node60 = Node(60)
node40 = Node(40, node50, node60)
node30 = Node(30, node70, node40)
root_node10 = Node(10, node20, node30)
roots = [root_node11, root_node1, root_node10]
t = Tree ()
for root in roots :
if (t.CheckIfHeightBalanced(root)) :
print("Tree with root (" + str(root.data) + ") is height balanced.")
else :
print("Tree with root (" + str(root.data) + ") is not height balanced.")
if __name__ == "__main__":
main()
Output
Tree with root (11) is height balanced.
Tree with root (1) is height balanced.
Tree with root (10) is not height balanced.
#include<iostream>
#include<vector>
using namespace std;
class Node {
public:
int data;
Node * left;
Node * right;
Node(int x) : data(x), left(nullptr), right(nullptr)
{}
Node(int x, Node* left_node, Node* right_node) : data(x), left(left_node), right(right_node)
{}
};
int FindHeight (Node * node) {
if (node == NULL)
return 0;
return (1 + max (FindHeight(node->left), FindHeight(node->right)));
}
bool CheckIfHeightBalanced (Node * root) {
if (root == NULL)
return true;
int height_left_subtree = FindHeight (root->left);
int height_right_subtree = FindHeight (root->right);
if ( abs(height_left_subtree - height_right_subtree) > 1 ) {
return false;
}
return (CheckIfHeightBalanced(root->left) && CheckIfHeightBalanced(root->right));
}
int main() {
/* Tree A is height-balanced.
11
/ \ ----- height 0
height 1--- 22
*/
Node node22(22);
Node root_node11(11, &node22, nullptr);
/* Tree B is height-balanced.
1
/ \
height 1---- 2 3
/ \
4 5 ----- height 2
*/
Node node4(4), node5(5), node2(2);
Node node3(3, &node4, &node5);
Node root_node1(1, &node2, &node3);
/* Tree C is not height-balanced as height difference is abs(1-3) = 2.
10
/ \
height 1--- 20 30
\
40
/ \
50 60 ------- height 3
*/
Node node50(50), node60(60), node20(20);
Node node40(40, &node50, &node60);
Node node30(30, nullptr, &node40);
Node root_node10(10, &node20, &node30);
vector<Node> roots = { root_node11, root_node1, root_node10 };
for (auto& root : roots) {
if ( CheckIfHeightBalanced (&root) ) {
cout << "Tree with root node (" << root.data << ") is height balanced." << endl;
} else {
cout << "Tree with root node (" << root.data << ") is not height balanced." << endl;
}
}
return 0;
}
Output
Tree with root node (11) is height balanced.
Tree with root node (1) is height balanced.
Tree with root node (10) is not height balanced.
class Node {
int data;
Node left, right;
Node (int n) {
data = n;
left = null;
right = null;
}
Node (int n, Node left_child, Node right_child) {
data = n;
left = left_child;
right = right_child;
}
public int FindHeight (Node node) {
if (node == null)
return 0;
return (1 + Math.max(FindHeight(node.left), FindHeight(node.right)));
}
public boolean CheckIfHeightBalanced (Node node) {
if (node == null) {
return Boolean.TRUE;
}
int height_left_subtree = FindHeight(node.left);
int height_right_subtree = FindHeight(node.right);
if (Math.abs(height_left_subtree - height_right_subtree) > 1) {
return Boolean.FALSE;
}
return (CheckIfHeightBalanced(node.left) && CheckIfHeightBalanced(node.right));
}
public static void main (String args[]) {
/* Tree A is height-balanced.
11
/ \ ----- height 0
height 1--- 22
*/
Node root_node11 = new Node(11);
Node node22 = new Node(22);
/* Tree B is height-balanced.
1
/ \
height 1---- 2 3
/ \
4 5 ----- height 2
*/
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node2 = new Node(2, node4, node5);
Node root_node1 = new Node(1, node2, node3);
/* Tree C is not height-balanced as height difference is abs(1-3) = 2.
10
/ \
height 1 --- 20 30
/ \
70 40
/ \
50 60 ------- height 3
*/
Node node50 = new Node(50);
Node node60 = new Node(60);
Node node70 = new Node(70);
Node node20 = new Node(20);
Node node40 = new Node(40, node50, node60);
Node node30 = new Node(30, node70, node40);
Node root_node10 = new Node(10, node20, node30);
Node [] roots = {root_node11, root_node1, root_node10};
for (Node n : roots) {
if (n.CheckIfHeightBalanced (n)) {
System.out.println("Tree with node (" + n.data + ") is height balanced.");
} else {
System.out.println("Tree with node (" + n.data + ") is not height balanced.");
}
}
}
}
Output
Tree with node (11) is height balanced.
Tree with node (1) is height balanced.
Tree with node (10) is not height balanced.
© 2019-2026 Algotree.org | All rights reserved.
This content is provided for educational purposes. Feel free to learn, practice, and share knowledge.
For questions or contributions, visit algotree.org
"There are two ways to write error-free programs; only the third one works. - Alan J. Perlis"