Bird
Raised Fist0
DSA C++programming~10 mins

Check if Binary Tree is Balanced in DSA C++ - Execution Trace

Choose your learning style10 modes available
Concept Flow - Check if Binary Tree is Balanced
Start at root
↓
Check left subtree height
↓
Check right subtree height
↓
Compare heights difference <= 1?
Yes↓
Check if left subtree balanced
↓
Check if right subtree balanced
↓
If both balanced, return True
No↓
Return False
We start from the root, check heights of left and right subtrees, compare their difference, and recursively verify if both subtrees are balanced.
Execution Sample
DSA C++
bool isBalanced(TreeNode* root) {
  if (!root) return true;
  int lh = height(root->left);
  int rh = height(root->right);
  if (abs(lh - rh) > 1) return false;
  return isBalanced(root->left) && isBalanced(root->right);
}
This code checks if a binary tree is balanced by comparing subtree heights and recursively checking subtrees.
Execution Table
StepOperationNode VisitedLeft HeightRight HeightHeight DifferenceBalanced?Tree State
1Start at root1????1 / \ 2 3
2Check left subtree height2????2 / \ 4 5
3Check left subtree height4000True4
4Check right subtree height5000True5
5Compare heights at node 22110True2 / \ 4 5
6Check right subtree height3????3 \ 6
7Check left subtree heightnull000Truenull
8Check right subtree height6000True6
9Compare heights at node 33011True3 \ 6
10Compare heights at root1220True1 / \ 2 3
11Check left subtree balanced2110True2 / \ 4 5
12Check right subtree balanced3011True3 \ 6
13Return final result1220True1 / \ 2 3
14ExitN/AN/AN/AN/ATrueBalanced tree confirmed
💡 All nodes checked, height differences <= 1, tree is balanced
Variable Tracker
VariableStartAfter Step 3After Step 5After Step 9After Step 10Final
rootNode 1Node 1Node 1Node 1Node 1Node 1
lh (left height)?11022
rh (right height)???122
balanced?TrueTrueTrueTrueTrue
Key Moments - 3 Insights
Why do we check height difference at every node instead of only at the root?
Because a subtree can be unbalanced even if the root looks balanced. The execution_table rows 5, 9, and 10 show height differences checked at each node to ensure full balance.
What happens if a subtree is null (empty)?
A null subtree has height 0 and is considered balanced. Step 7 shows checking a null node returns height 0 and balanced True.
Why do we recursively check both left and right subtrees for balance?
Because both subtrees must be balanced for the whole tree to be balanced. Steps 11 and 12 show recursive balance checks on left and right subtrees.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 5, what is the height difference at node 2?
A0
B1
C2
DUndefined
💡 Hint
Check the 'Height Difference' column at step 5 in the execution_table.
At which step does the algorithm confirm the right subtree of node 3 is balanced?
AStep 7
BStep 9
CStep 8
DStep 12
💡 Hint
Look at the 'Balanced?' column and 'Node Visited' at step 8 in the execution_table.
If the height difference at the root was 3, what would be the balanced result at step 10?
ATrue
BFalse
CDepends on subtrees
DCannot determine
💡 Hint
Recall the condition abs(lh - rh) > 1 returns false balance; see step 10 logic.
Concept Snapshot
Check if Binary Tree is Balanced:
- For each node, get left and right subtree heights
- If height difference > 1, tree is unbalanced
- Recursively check left and right subtrees
- Return true only if all nodes balanced
- Base case: null node is balanced with height 0
Full Transcript
To check if a binary tree is balanced, we start at the root node. We find the height of the left subtree and the right subtree. We compare their heights. If the difference is more than 1, the tree is not balanced. If the difference is 1 or less, we check recursively if the left subtree is balanced and if the right subtree is balanced. If both are balanced, the whole tree is balanced. If any subtree is not balanced, the whole tree is not balanced. A null subtree has height zero and is balanced by definition. This process continues until all nodes are checked or an imbalance is found.

Practice

(1/5)
1. What does it mean for a binary tree to be balanced?
easy
A. All nodes have two children
B. The height difference between left and right subtrees of every node is at most 1
C. The tree has the same number of nodes on left and right
D. The tree is a complete binary tree

Solution

  1. Step 1: Understand balance condition

    A balanced binary tree means the height difference between left and right subtrees of every node is at most 1.
  2. Step 2: Compare other options

    Options B, C, and D describe other tree properties but not the balance condition.
  3. Final Answer:

    The height difference between left and right subtrees of every node is at most 1 -> Option B
  4. Quick Check:

    Balance means height difference ≤ 1 [OK]
Hint: Balance means height difference ≤ 1 at every node [OK]
Common Mistakes:
  • Confusing balanced with complete tree
  • Thinking balance means equal number of nodes
  • Assuming all nodes must have two children
2. Which of the following C++ function signatures is correct to check if a binary tree is balanced?
easy
A. bool isBalanced(TreeNode* root);
B. int isBalanced(TreeNode root);
C. void isBalanced(TreeNode* root);
D. bool isBalanced(TreeNode root);

Solution

  1. Step 1: Identify correct parameter type

    The function should accept a pointer to the root node (TreeNode* root) to access the tree.
  2. Step 2: Identify correct return type

    It should return bool to indicate if the tree is balanced or not.
  3. Final Answer:

    bool isBalanced(TreeNode* root); -> Option A
  4. Quick Check:

    Pointer parameter + bool return = correct signature [OK]
Hint: Use pointer parameter and bool return type [OK]
Common Mistakes:
  • Passing node by value instead of pointer
  • Using int or void as return type
  • Missing pointer symbol * in parameter
3. What will be the output of the following code snippet?
struct TreeNode {
  int val;
  TreeNode* left;
  TreeNode* right;
  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

int height(TreeNode* root) {
  if (!root) return 0;
  int leftHeight = height(root->left);
  int rightHeight = height(root->right);
  return 1 + (leftHeight > rightHeight ? leftHeight : rightHeight);
}

bool isBalanced(TreeNode* root) {
  if (!root) return true;
  int leftHeight = height(root->left);
  int rightHeight = height(root->right);
  if (abs(leftHeight - rightHeight) > 1) return false;
  return isBalanced(root->left) && isBalanced(root->right);
}

int main() {
  TreeNode* root = new TreeNode(1);
  root->left = new TreeNode(2);
  root->right = new TreeNode(3);
  root->left->left = new TreeNode(4);
  root->left->left->left = new TreeNode(5);
  std::cout << (isBalanced(root) ? "Balanced" : "Not Balanced") << std::endl;
  return 0;
}
medium
A. Not Balanced
B. Balanced
C. Compilation Error
D. Runtime Error

Solution

  1. Step 1: Calculate heights of subtrees

    Left subtree has height 3 (nodes 2->4->5), right subtree height is 1 (node 3).
  2. Step 2: Check balance condition

    Height difference at root is 3 - 1 = 2, which is greater than 1, so tree is not balanced.
  3. Final Answer:

    Not Balanced -> Option A
  4. Quick Check:

    Height difference > 1 means Not Balanced [OK]
Hint: Check height difference > 1 means unbalanced [OK]
Common Mistakes:
  • Ignoring height difference at root
  • Assuming tree is balanced if only some nodes are balanced
  • Confusing height with number of nodes
4. Identify the bug in this code snippet that checks if a binary tree is balanced:
int height(TreeNode* root) {
  if (!root) return 0;
  int leftHeight = height(root->left);
  int rightHeight = height(root->right);
  return 1 + (leftHeight > rightHeight ? leftHeight : rightHeight);
}

bool isBalanced(TreeNode* root) {
  if (!root) return true;
  int leftHeight = height(root->left);
  int rightHeight = height(root->right);
  if (abs(leftHeight - rightHeight) > 1) return false;
  isBalanced(root->left);
  isBalanced(root->right);
  return true;
}
medium
A. Base case in height is incorrect
B. height function returns wrong height
C. abs function is not included
D. Missing return statements for recursive calls in isBalanced

Solution

  1. Step 1: Analyze isBalanced recursive calls

    Recursive calls to isBalanced(root->left) and isBalanced(root->right) are made but their results are ignored.
  2. Step 2: Fix missing return statements

    Must return the logical AND of these calls to correctly check balance in subtrees.
  3. Final Answer:

    Missing return statements for recursive calls in isBalanced -> Option D
  4. Quick Check:

    Recursive calls must return and combine results [OK]
Hint: Return recursive calls combined with && [OK]
Common Mistakes:
  • Ignoring return values of recursive calls
  • Returning true too early
  • Incorrect base case handling
5. Given a binary tree, how can you optimize the balance check to avoid repeated height calculations?
hard
A. Use breadth-first traversal to check balance
B. Calculate height separately for left and right subtrees multiple times
C. Use a helper function that returns both height and balance status in one traversal
D. Check balance only at the root node

Solution

  1. Step 1: Understand repeated height calculation problem

    Calculating height separately for each node causes repeated work and increases time complexity.
  2. Step 2: Use combined helper function

    A helper function can return both height and balance status together, allowing one traversal to check balance efficiently.
  3. Final Answer:

    Use a helper function that returns both height and balance status in one traversal -> Option C
  4. Quick Check:

    Combine height and balance check in one pass [OK]
Hint: Combine height and balance check in one function [OK]
Common Mistakes:
  • Calculating height multiple times causing O(n²) time
  • Checking balance only at root misses subtree imbalance
  • Using BFS does not directly help balance check
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard