What is the Lowest Common Ancestor (LCA) in a binary tree?
The Lowest Common Ancestor of two nodes in a binary tree is the deepest (lowest) node that has both nodes as descendants (where a node can be a descendant of itself).
Click to reveal answer
beginner
In the context of LCA, what does it mean if a node is a descendant of itself?
It means that when checking if a node is a descendant of another, the node itself counts as its own descendant. So if the node is one of the two nodes we are finding LCA for, it can be the ancestor.
Click to reveal answer
intermediate
What is the base case in a recursive function to find LCA in a binary tree?
If the current node is null (no node) or matches one of the two target nodes, return the current node.
Click to reveal answer
intermediate
How does the recursive LCA function decide the LCA when both left and right recursive calls return non-null nodes?
If both left and right recursive calls return non-null nodes, it means the two target nodes are found in different subtrees, so the current node is their LCA.
Click to reveal answer
intermediate
What is the time complexity of finding LCA in a binary tree using a single traversal?
The time complexity is O(n), where n is the number of nodes in the tree, because each node is visited once during the traversal.
Click to reveal answer
What does the Lowest Common Ancestor represent in a binary tree?
AThe root node of the tree
BThe deepest node that is ancestor to both given nodes
CThe node with the smallest value
DThe leaf node closest to the root
✗ Incorrect
The LCA is the deepest node that has both given nodes as descendants.
In the recursive LCA algorithm, what should be returned if the current node is one of the target nodes?
AReturn the current node
BReturn null
CReturn the left child
DReturn the right child
✗ Incorrect
If the current node matches one of the target nodes, it should be returned as a potential ancestor.
If the left recursive call returns a node and the right recursive call returns null, what does the LCA function return?
AThe right node
BNull
CThe current node
DThe left node
✗ Incorrect
If only one side returns a node, that node is returned upwards as a potential ancestor.
What is the time complexity of the standard recursive LCA algorithm in a binary tree?
AO(n)
BO(log n)
CO(n^2)
DO(1)
✗ Incorrect
The algorithm visits each node once, so the time complexity is O(n).
Which of the following is NOT true about the Lowest Common Ancestor?
AIt can be one of the nodes itself
BIt can be found using recursion
CIt is always the root node
DIt is the lowest node with both nodes as descendants
✗ Incorrect
The LCA is not always the root; it depends on the nodes' positions.
Explain how the recursive algorithm finds the Lowest Common Ancestor in a binary tree.
Think about how recursion explores subtrees and combines results.
You got /4 concepts.
Describe the meaning of Lowest Common Ancestor and why it can be one of the nodes itself.
Consider the definition of descendant including the node itself.
You got /3 concepts.
Practice
(1/5)
1. What is the Lowest Common Ancestor (LCA) of two nodes in a binary tree?
easy
A. The root node of the binary tree
B. The node with the smallest value between the two nodes
C. The deepest node that is an ancestor of both nodes
D. The parent node of the first node
Solution
Step 1: Understand the definition of LCA
The Lowest Common Ancestor is the deepest node in the tree that has both given nodes as descendants.
Step 2: Compare options with definition
The deepest node that is an ancestor of both nodes matches the definition exactly. Other options describe different nodes.
Final Answer:
The deepest node that is an ancestor of both nodes -> Option C
Quick Check:
LCA = deepest common ancestor [OK]
Hint: LCA is the deepest shared parent node [OK]
Common Mistakes:
Confusing LCA with root node
Thinking LCA is the smaller value node
Assuming LCA is always the parent of one node
2. Which of the following is the correct Python function signature to find LCA in a binary tree node class named TreeNode?
easy
A. def find_lca(root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
B. def find_lca(root, p, q): return int
C. def find_lca(root: int, p: int, q: int) -> TreeNode:
D. def find_lca(root: TreeNode, p: TreeNode, q: TreeNode): return str
Solution
Step 1: Check parameter types and return type
The function should accept three TreeNode objects and return a TreeNode object representing the LCA.
Step 2: Match with options
def find_lca(root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode: correctly uses type hints for parameters and return type. Others have wrong types or return types.
Correct signature uses TreeNode and returns TreeNode [OK]
Hint: Use TreeNode type hints for nodes and return [OK]
Common Mistakes:
Using int instead of TreeNode for parameters
Returning wrong type like int or str
Omitting return type annotation
3. Given the following binary tree and code, what will be the output?
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def lowestCommonAncestor(root, p, q):
if not root or root == p or root == q:
return root
left = lowestCommonAncestor(root.left, p, q)
right = lowestCommonAncestor(root.right, p, q)
if left and right:
return root
return left if left else right
# Tree:
# 3
# / \
# 5 1
# / \ / \
# 6 2 0 8
# / \
# 7 4
root = TreeNode(3)
root.left = TreeNode(5)
root.right = TreeNode(1)
root.left.left = TreeNode(6)
root.left.right = TreeNode(2)
root.right.left = TreeNode(0)
root.right.right = TreeNode(8)
root.left.right.left = TreeNode(7)
root.left.right.right = TreeNode(4)
p = root.left # Node 5
q = root.left.right.right # Node 4
ancestor = lowestCommonAncestor(root, p, q)
print(ancestor.val)
medium
A. 4
B. 3
C. 2
D. 5
Solution
Step 1: Trace recursive calls for nodes 5 and 4
Node 5 is root.left, node 4 is root.left.right.right. The LCA is the lowest node that has both as descendants. Node 5 is an ancestor of node 4.
Step 2: Identify the LCA node
Since 5 is ancestor of 4, LCA is node 5 itself.
Final Answer:
5 -> Option D
Quick Check:
LCA(5,4) = 5 [OK]
Hint: If one node is ancestor of other, LCA is that node [OK]
Common Mistakes:
Choosing root (3) instead of ancestor node
Confusing node values with LCA
Ignoring that node can be ancestor of itself
4. The following code attempts to find the LCA but has a bug. What is the error?
def lowestCommonAncestor(root, p, q):
if not root:
return None
if root == p or root == q:
return root
left = lowestCommonAncestor(root.left, p, q)
right = lowestCommonAncestor(root.right, p, q)
if left and right:
return root
if left:
return left
else:
return right
# Bug: The function sometimes returns None even if both nodes exist in tree.
medium
A. The function should not return root when left and right are both found
B. The function does not check if both nodes exist in the tree before returning
C. The function should return left and right together instead of root when both exist
D. The base case should return root instead of None when root is None
Solution
Step 1: Analyze base cases and recursive returns
The function returns None if root is None, and returns root if root matches p or q. It then searches left and right subtrees.
Step 2: Identify missing check for node existence
If one node is not in the tree, the function may return None incorrectly. It does not verify both nodes exist before returning LCA.
Final Answer:
The function does not check if both nodes exist in the tree before returning -> Option B
Quick Check:
Missing node existence check causes None returns [OK]
Hint: Verify both nodes exist before returning LCA [OK]
Common Mistakes:
Assuming both nodes always exist in tree
Changing base case to return root when root is None
Returning root incorrectly when both left and right found
5. You have a binary tree where nodes can have duplicate values. How should you modify the LCA function to correctly find the LCA of two nodes p and q given only their values (not references)?
hard
A. Modify the function to find all nodes with given values and find LCA of all pairs
B. Use node references instead of values to avoid ambiguity
C. Modify the function to search nodes by value and return the first matching node found
D. Return the root node always since duplicates confuse the search
Solution
Step 1: Understand problem with duplicate values
When values are duplicated, searching by value alone can find multiple nodes, so LCA must consider all matching nodes.
Step 2: Modify approach to handle duplicates
Find all nodes matching p and q values, then compute LCA for each pair to find the correct lowest common ancestor.
Final Answer:
Modify the function to find all nodes with given values and find LCA of all pairs -> Option A
Quick Check:
Handle duplicates by checking all matching nodes [OK]
Hint: Check all nodes with values to handle duplicates [OK]
Common Mistakes:
Using only first found node causing wrong LCA
Assuming node references are always available
Returning root node incorrectly for duplicates
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.