Merge Two Binary Trees – Solution & Complexity

Solution Walkthrough

  1. Step 1: Recognize the Pattern

    The key pattern is: synchronized preorder recursion over two trees at once, where a missing node on either side contributes 0 and an empty subtree on both sides ends the recursion.

  2. Step 2: Build the Algorithm

    Advance one state transition at a time. Mark or update state before exploring dependent work.

  3. Step 3: Check Edge Cases

    Test empty or minimal input, skewed shapes, duplicates where allowed, and impossible outcomes.

  4. Step 4: Solution and Complexity

    Time: O(min(m, n)) — recursion only descends as long as at least one of the two trees still has a node at that position; m and n are the node counts of t1 and t2. Space: O(min(m, n)) for the recursion stack in the worst case (skewed trees).

    All 5 languages below run and submit against the remote judge for this problem — Java/Go/Rust use the same real TreeNode structural-type support the judge added for the rest of the linked-list/tree track.

    def merge_trees(t1: TreeNode, t2: TreeNode) -> TreeNode:
        if t1 is None and t2 is None:
            return None
    
        v1 = t1.val if t1 else 0
        v2 = t2.val if t2 else 0
        merged = TreeNode(v1 + v2)
        merged.left = merge_trees(t1.left if t1 else None, t2.left if t2 else None)
        merged.right = merge_trees(t1.right if t1 else None, t2.right if t2 else None)
        return merged

FAQ