11. Same Tree
easyAsked at DatabricksCheck whether two binary trees are structurally identical with the same values. Databricks uses this to test recursive pattern-matching, which is the same template Catalyst uses to compare query subtrees during optimizer rule application.
By Alex Chen, Founder, InterviewChamp.AI · Last verified
Source citations
Public interview reports confirming this problem appears in Databricks loops.
- Glassdoor (2025-08)— Databricks Catalyst engineer phone screen warm-up.
- LeetCode Discuss (2026-Q1)— Asked as a precursor to subtree-matching / plan-equality questions.
Problem
Given the roots of two binary trees p and q, write a function to check if they are the same or not. Two binary trees are considered the same if they are structurally identical and the nodes have the same value.
Constraints
The number of nodes in both trees is in the range [0, 100].-10^4 <= Node.val <= 10^4
Examples
Example 1
p = [1,2,3], q = [1,2,3]trueExample 2
p = [1,2], q = [1,null,2]falseExample 3
p = [1,2,1], q = [1,1,2]falseApproaches
1. Serialize and compare strings
Serialize each tree (with null markers) and compare.
- Time
- O(n)
- Space
- O(n)
function isSameTree(p, q) {
const ser = (n) => !n ? '#' : `(${n.val},${ser(n.left)},${ser(n.right)})`;
return ser(p) === ser(q);
}Tradeoff: Works but allocates two full strings; misses the early-exit opportunity.
2. Recursive structural comparison
Both null -> true. One null -> false. Else val match AND left match AND right match.
- Time
- O(min(n, m))
- Space
- O(h) recursion stack
function isSameTree(p, q) {
if (!p && !q) return true;
if (!p || !q) return false;
return p.val === q.val
&& isSameTree(p.left, q.left)
&& isSameTree(p.right, q.right);
}Tradeoff: Short-circuits on first difference. The && chain saves work — only descends if val matches.
Databricks-specific tips
Databricks engineers reach for this pattern when comparing query subtrees during optimizer rules (e.g., common subexpression elimination). The bonus signal is articulating that this is canonical structural recursion: 'base cases first, then val match, then descend.' Volunteer that early-exit via short-circuit && saves significant work in the common case where trees differ near the root.
Common mistakes
- Comparing object identity (p === q) instead of structural — that's reference equality, which only works for the same node.
- Forgetting the (!p && !q) base case — recursing into null crashes.
- Checking length/size first — for unbalanced trees that's an O(n) precheck that the recursion already does for free.
Follow-up questions
An interviewer at Databricks may pivot to one of these next:
- Subtree of Another Tree (LC 572).
- Compare query plans for equivalence ignoring expression aliases.
- Add tolerance for floating-point node values (within epsilon).
Solve it now
Free. No sign-up. Python and JavaScript run instantly in your browser.
FAQ
Why both base cases?
If both are null, the trees match here. If exactly one is null, they don't. Without the second check, you'd dereference a null pointer.
How does this scale to query-plan equality?
Same recursive shape: compare node type, compare children pairwise. Catalyst's QueryPlan.sameResult uses this pattern with semantic checks added (e.g., aliases ignored).
Practice these live with InterviewChamp.AI
Drill Same Tree and other Databricks interview questions under real-loop conditions with instant feedback on your reasoning, complexity claims, and code.
Practice these live with InterviewChamp.AI →