Check if Binary Tree is Balanced in DSA Javascript - Time & Space Complexity
We want to know how long it takes to check if a binary tree is balanced.
Specifically, how the time grows as the tree gets bigger.
Analyze the time complexity of the following code snippet.
function isBalanced(root) {
function checkHeight(node) {
if (!node) return 0;
const leftHeight = checkHeight(node.left);
if (leftHeight === -1) return -1;
const rightHeight = checkHeight(node.right);
if (rightHeight === -1) return -1;
if (Math.abs(leftHeight - rightHeight) > 1) return -1;
return Math.max(leftHeight, rightHeight) + 1;
}
return checkHeight(root) !== -1;
}
This code checks if a binary tree is balanced by measuring heights and stopping early if imbalance is found.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls visiting each node once.
- How many times: Each node is visited once to calculate height and check balance.
As the tree grows, the function visits each node once, so operations grow directly with number of nodes.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 visits |
| 100 | About 100 visits |
| 1000 | About 1000 visits |
Pattern observation: Operations increase linearly as tree size increases.
Time Complexity: O(n)
This means the time to check balance grows in direct proportion to the number of nodes in the tree.
[X] Wrong: "The function only checks the root, so it runs in constant time O(1)."
[OK] Correct: The function must visit every node to check heights and balance, so it depends on tree size.
Understanding this helps you explain how recursion explores trees efficiently and why early stopping matters.
"What if the function did not stop early on imbalance and always checked all nodes? How would the time complexity change?"
Practice
Solution
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.Step 2: Compare other options
Options A, B, and D describe other tree properties but not the balance condition.Final Answer:
The height difference between left and right subtrees of every node is at most 1 -> Option DQuick Check:
Balance means height difference ≤ 1 [OK]
- Confusing balanced with complete tree
- Thinking balance means equal nodes on both sides
- Assuming all nodes must have two children
Solution
Step 1: Identify common parameter for tree root
The function should accept the root node as a parameter to check balance.Step 2: Check function signatures
Only function isBalanced(root) { ... } uses a clear parameter named 'root' which is standard for tree root nodes.Final Answer:
function isBalanced(root) { ... } -> Option BQuick Check:
Function needs root parameter [OK]
- Omitting root parameter
- Using unclear or no parameters
- Using function names that don't indicate balance check
class Node {
constructor(val) {
this.val = val;
this.left = null;
this.right = null;
}
}
function height(node) {
if (!node) return 0;
return 1 + Math.max(height(node.left), height(node.right));
}
function isBalanced(root) {
if (!root) return true;
let leftHeight = height(root.left);
let rightHeight = height(root.right);
if (Math.abs(leftHeight - rightHeight) > 1) return false;
return isBalanced(root.left) && isBalanced(root.right);
}
const root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.left.left = new Node(5);
console.log(isBalanced(root));Solution
Step 1: Calculate heights of left and right subtrees
Left subtree height is 3 (nodes 2 -> 4 -> 5), right subtree height is 1 (node 3).Step 2: Check balance condition at root
Height difference is 3 - 1 = 2, which is greater than 1, so tree is not balanced.Final Answer:
false -> Option AQuick Check:
Height difference > 1 means not balanced [OK]
- Ignoring deeper subtree height
- Assuming tree is balanced if root has two children
- Confusing height with number of nodes
function isBalanced(root) {
if (!root) return true;
let leftHeight = height(root.left);
let rightHeight = height(root.right);
if (Math.abs(leftHeight - rightHeight) > 1) return false;
isBalanced(root.left);
isBalanced(root.right);
return true;
}Solution
Step 1: Analyze recursive calls
The calls to isBalanced(root.left) and isBalanced(root.right) are made but their results are not returned or checked.Step 2: Identify missing return usage
Without returning these recursive calls, the function always returns true after checking root, ignoring subtree balance.Final Answer:
Missing return statements for recursive calls -> Option CQuick Check:
Recursive calls must return their results [OK]
- Not returning recursive call results
- Assuming base case covers all
- Ignoring subtree balance checks
Solution
Step 1: Understand inefficiency of separate height calculations
Calculating height separately for each node causes repeated work, increasing time complexity.Step 2: Use bottom-up recursion
Returning height and balance status together in one recursion avoids repeated height calculations, improving efficiency.Final Answer:
Use a bottom-up recursion that returns height and balance status together -> Option AQuick Check:
Bottom-up recursion avoids repeated height calls [OK]
- Recalculating heights multiple times
- Checking balance only at root
- Using level order traversal for balance
Ready to prove it?
Pass the test and this pattern moves unknown
