0
0
DSA C++programming~10 mins

Lowest Common Ancestor in Binary Tree in DSA C++ - Execution Trace

Choose your learning style9 modes available
Concept Flow - Lowest Common Ancestor in Binary Tree
Start at root node
Check if root is null or matches p or q
Yes
Return root
No
Recurse left subtree
Recurse right subtree
If left and right both non-null
Return root as LCA
Return non-null child (left or right)
Start from root, recursively search left and right subtrees for nodes p and q. If both sides return non-null, root is LCA. Otherwise, return the non-null side.
Execution Sample
DSA C++
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
  if (!root || root == p || root == q) return root;
  TreeNode* left = lowestCommonAncestor(root->left, p, q);
  TreeNode* right = lowestCommonAncestor(root->right, p, q);
  if (left && right) return root;
  return left ? left : right;
}
Finds the lowest common ancestor of nodes p and q in a binary tree by recursive search.
Execution Table
StepOperationNode VisitedLeft ResultRight ResultReturn ValueVisual State
1Start at root3???3
2Check root == p or q3??No3
3Recurse left subtree5???3 -> 5
4Check root == p or q5??No3 -> 5
5Recurse left subtree6???3 -> 5 -> 6
6Check root == p or q6??Yes (matches p)3 -> 5 -> 6
7Return node 666?63 -> 5 -> 6
8Recurse right subtree2???3 -> 5 -> 6, 2
9Check root == p or q2??No3 -> 5 -> 6, 2
10Recurse left subtree7???3 -> 5 -> 6, 2 -> 7
11Check root == p or q7??Yes (matches q)3 -> 5 -> 6, 2 -> 7
12Return node 77?773 -> 5 -> 6, 2 -> 7
13Recurse right subtree4???3 -> 5 -> 6, 2 -> 7, 4
14Check root == p or q4??No3 -> 5 -> 6, 2 -> 7, 4
15Recurse left subtreenullnull?null3 -> 5 -> 6, 2 -> 7, 4
16Return nullnullnull?null3 -> 5 -> 6, 2 -> 7, 4
17Recurse right subtreenull?nullnull3 -> 5 -> 6, 2 -> 7, 4
18Return nullnull?nullnull3 -> 5 -> 6, 2 -> 7, 4
19Return left or right4nullnullnull3 -> 5 -> 6, 2 -> 7, 4
20Return left or right27null73 -> 5 -> 6, 2 -> 7
21Return left or right56733
22Both left and right non-null, return root36733
💡 At root 3, left subtree returned node 6, right subtree returned node 7, so root 3 is LCA.
Variable Tracker
VariableStartAfter Step 6After Step 12After Step 20Final
root36733
left?6666
right??777
Return Value?6773
Key Moments - 3 Insights
Why do we return root immediately if root matches p or q?
Because if root is p or q, it could be the ancestor or one of the nodes itself. See step 6 where root 6 matches p and returns immediately.
Why do we return root when both left and right recursive calls are non-null?
Because it means p and q are found in different subtrees, so current root is their lowest common ancestor. See step 22 where both left=6 and right=7 are non-null, so root 3 is returned.
What if one subtree returns null?
We return the non-null subtree result because both p and q are in that subtree or one is ancestor of the other. See step 20 where left=7 and right=null returns 7.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table at step 6, what is the return value and why?
AReturns node 6 because root matches p
BReturns null because no match
CReturns node 3 because root is ancestor
DReturns node 7 because it matches q
💡 Hint
Check step 6 in execution_table where root == p returns root
At which step does the function determine the lowest common ancestor?
AStep 12
BStep 20
CStep 22
DStep 7
💡 Hint
Look for step where both left and right are non-null and root is returned
If node q was not in the tree, how would the return value at step 22 change?
AIt would return node 6
BIt would return null
CIt would return node 3
DIt would return node 7
💡 Hint
If one subtree returns null, return the other subtree's result as per step 20
Concept Snapshot
Lowest Common Ancestor (LCA) finds the deepest node that is ancestor of both p and q.
Use recursion: if root is null or matches p/q, return root.
Recurse left and right subtrees.
If both sides return non-null, root is LCA.
Else return the non-null side.
This works for any binary tree, not just BST.
Full Transcript
The Lowest Common Ancestor in a binary tree is found by starting at the root and recursively searching for nodes p and q in the left and right subtrees. If the current root is null or matches either p or q, it returns the root immediately. Otherwise, it searches left and right subtrees. If both recursive calls return non-null, it means p and q are found in different subtrees, so the current root is their lowest common ancestor. If only one side returns non-null, that side is returned upwards. This process continues until the LCA is found or the search ends. The execution table traces each step visiting nodes, checking conditions, and returning values, showing how the recursion unfolds and combines results to find the LCA.