What if you could tell if a huge tree is balanced with just one quick walk through it?
Why Check if Binary Tree is Balanced in DSA Python?
Imagine you have a family tree drawn on paper. You want to quickly see if the tree is balanced, meaning no side is too heavy or too light compared to the other. Doing this by counting every branch and comparing by hand is tiring and confusing.
Manually checking if a tree is balanced means counting the height of every branch repeatedly. This takes a lot of time and you can easily make mistakes, especially if the tree is big. It's like measuring every branch with a ruler again and again.
Using a smart method, we can check if the tree is balanced by looking at each node just once. This way, we quickly find out if any part is too tall or too short without repeating work. It's like having a helper who tells you the height of each branch as you go.
def height(node): if not node: return 0 return 1 + max(height(node.left), height(node.right)) def is_balanced(node): if not node: return True left_height = height(node.left) right_height = height(node.right) if abs(left_height - right_height) > 1: return False return is_balanced(node.left) and is_balanced(node.right)
def check_balance(node): if not node: return 0, True left_height, left_balanced = check_balance(node.left) right_height, right_balanced = check_balance(node.right) current_balanced = left_balanced and right_balanced and abs(left_height - right_height) <= 1 return 1 + max(left_height, right_height), current_balanced def is_balanced(root): _, balanced = check_balance(root) return balanced
This lets us quickly and correctly find out if a tree is balanced, even if it is very big, saving time and avoiding mistakes.
When building a search system, balanced trees help find information fast. Checking balance ensures the system stays quick and efficient.
Manual height checks repeat work and are slow.
Smart checking visits each node once, saving time.
Balanced trees keep data easy to find and manage.
Practice
balanced?Solution
Step 1: Understand the balance condition
A balanced binary tree means for every node, the height difference between its left and right subtree is at most 1.Step 2: Compare options with definition
The height difference between left and right subtrees of every node is at most 1 matches this definition exactly, while others describe different tree properties.Final Answer:
The height difference between left and right subtrees of every node is at most 1 -> Option CQuick Check:
Balanced tree = height difference ≤ 1 [OK]
- Confusing balanced with complete tree
- Thinking balanced means equal number of nodes
- Assuming all nodes must have two children
Solution
Step 1: Identify correct parameter type for binary tree root
The root of a binary tree is typically a TreeNode or None, so Optional[TreeNode] is correct.Step 2: Check return type for balance check
The function should return a boolean indicating if the tree is balanced, so return type bool is correct.Final Answer:
def is_balanced(root: Optional[TreeNode]) -> bool: -> Option DQuick Check:
Function signature matches tree root and bool return [OK]
- Using int or str as input instead of TreeNode
- Returning int instead of bool
- Using list instead of tree node
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def check_height(node):
if not node:
return 0
left_height = check_height(node.left)
right_height = check_height(node.right)
if left_height == -1 or right_height == -1 or abs(left_height - right_height) > 1:
return -1
return max(left_height, right_height) + 1
def is_balanced(root):
return check_height(root) != -1
root = TreeNode(1, TreeNode(2, TreeNode(3)), TreeNode(4))
print(is_balanced(root))Solution
Step 1: Analyze tree structure
The tree root has left child 2 with left child 3, and right child 4. Left subtree height is 2, right subtree height is 1.Step 2: Check balance condition
At root, height difference is abs(2 - 1) = 1, which is allowed. But node 2 has left child 3 and no right child, so difference is abs(1 - 0) = 1, allowed. So tree is balanced.Step 3: Re-examine code logic
Wait, the code returns -1 if difference > 1. Here difference never exceeds 1, so check_height returns height, is_balanced returns True.Step 4: Re-examine the tree carefully
Node 2 has left child 3 (height 1) and no right child (height 0), difference is 1 (allowed). Root has left subtree height 2, right subtree height 1, difference 1 (allowed). So tree is balanced.Final Answer:
True -> Option BQuick Check:
Height difference ≤ 1 means balanced = True [OK]
- Miscounting subtree heights
- Confusing -1 return as False directly
- Ignoring base case for None nodes
def is_balanced(root):
def height(node):
if not node:
return 0
left = height(node.left)
right = height(node.right)
if abs(left - right) > 1:
return False
return max(left, right) + 1
return height(root) != FalseSolution
Step 1: Understand return values in height function
The height function returns integer heights, but returns False when unbalanced, mixing types.Step 2: Identify impact on recursion
Returning False breaks max(left, right) + 1 calculation because max expects integers, causing errors or wrong results.Final Answer:
Returning False instead of -1 breaks height calculation -> Option AQuick Check:
Use -1 for unbalanced, not False [OK]
- Mixing boolean and integer return types
- Incorrect final check with != False
- Not propagating unbalanced signal properly
Solution
Step 1: Understand naive approach drawbacks
Calculating height separately for each node causes repeated work, leading to O(n²) time.Step 2: Identify efficient approach
Bottom-up recursion returns height if balanced, or -1 if unbalanced, stopping early and avoiding repeated height calculations.Step 3: Compare other options
Options B and C cause repeated calculations; D (BFS) does not directly check subtree heights efficiently.Final Answer:
Use a bottom-up recursion returning height or -1 if unbalanced -> Option AQuick Check:
Bottom-up recursion = efficient balance check [OK]
- Using top-down approach causing repeated height calls
- Trying BFS which doesn't check subtree heights easily
- Checking balance after separate height computations
Ready to prove it?
Pass the test and this pattern moves unknown
