š Scenario: You are working on a program that manages a family tree. To keep the tree easy to search and update, you want to check if the tree is balanced. A balanced tree means the left and right branches of every node do not differ in height by more than one.
šÆ Goal: Build a program that creates a binary tree, sets up a helper function to check heights, then writes the logic to check if the tree is balanced.
š What You'll Learn
Create a binary tree using a Node class with value, left, and right attributes
Create a helper function height that returns the height of a node
Create a function is_balanced that returns True if the tree is balanced, otherwise False
Print the result of is_balanced(root) to show if the tree is balanced
š” Why This Matters
š Real World
Balanced binary trees are used in databases and file systems to keep data organized for fast searching and updating.
š¼ Career
Understanding tree balance is important for software engineers working with data structures, algorithms, and performance optimization.
Progress0 / 4 steps
1
Create the Binary Tree Structure
Create a class called Node with an __init__ method that takes value, left, and right parameters. Then create a binary tree with root node value 1, left child value 2, and right child value 3. The left child should have a left child with value 4. Assign the root node to a variable called root.
DSA Python
Hint
Define the Node class first. Then create nodes inside nodes to build the tree.
2
Create a Helper Function to Find Height
Create a function called height that takes a node parameter. It should return 0 if the node is None. Otherwise, return 1 + max(height(node.left), height(node.right)).
DSA Python
Hint
Use recursion to find the height of left and right children, then add 1 for the current node.
3
Write the Function to Check if Tree is Balanced
Create a function called is_balanced that takes a node parameter. If the node is None, return True. Calculate the heights of the left and right children using the height function. If the absolute difference between these heights is more than 1, return False. Otherwise, return is_balanced(node.left) and is_balanced(node.right).
DSA Python
Hint
Check the height difference at each node and recursively check left and right subtrees.
4
Print the Result of Balance Check
Write a print statement to display the result of calling is_balanced(root).
DSA Python
Hint
Use print(is_balanced(root)) to show if the tree is balanced.
Practice
(1/5)
1. What does it mean for a binary tree to be balanced?
easy
A. The tree has the same number of nodes on left and right
B. All nodes have two children
C. The height difference between left and right subtrees of every node is at most 1
D. The tree is a complete binary tree
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 C
Quick Check:
Balanced tree = height difference ⤠1 [OK]
Hint: Balance means height difference ⤠1 at every node [OK]
Common Mistakes:
Confusing balanced with complete tree
Thinking balanced means equal number of nodes
Assuming all nodes must have two children
2. Which of the following Python function signatures is correct to check if a binary tree is balanced?
easy
A. def is_balanced(root: List[int]) -> bool:
B. def is_balanced(root: int) -> int:
C. def is_balanced(tree: str) -> bool:
D. def is_balanced(root: Optional[TreeNode]) -> bool:
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 D
Quick Check:
Function signature matches tree root and bool return [OK]
Hint: Use TreeNode or Optional[TreeNode] as input, bool as output [OK]
Common Mistakes:
Using int or str as input instead of TreeNode
Returning int instead of bool
Using list instead of tree node
3. What will be the output of the following code snippet?
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))
medium
A. Runtime Error
B. True
C. None
D. False
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 B
Quick Check:
Height difference ⤠1 means balanced = True [OK]
Hint: Check height difference at each node; -1 means unbalanced [OK]
Common Mistakes:
Miscounting subtree heights
Confusing -1 return as False directly
Ignoring base case for None nodes
4. Find the bug in this code that checks if a binary tree is balanced:
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) != False
medium
A. Returning False instead of -1 breaks height calculation
B. Using != False instead of is not False causes error
C. Missing base case for leaf nodes
D. Not checking left and right subtree balance separately
Solution
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 A
Quick Check:
Use -1 for unbalanced, not False [OK]
Hint: Use -1 for unbalanced, not False, to keep height numeric [OK]
Common Mistakes:
Mixing boolean and integer return types
Incorrect final check with != False
Not propagating unbalanced signal properly
5. Given a binary tree, which approach efficiently checks if it is balanced without recalculating heights multiple times?
hard
A. Use a bottom-up recursion returning height or -1 if unbalanced
B. Calculate height for each node separately, then check balance
C. Traverse tree twice: once for height, once for balance
D. Use breadth-first search to check balance at each level
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 A