Bird
Raised Fist0
DSA Goprogramming

Path Sum Root to Leaf in Binary Tree in DSA Go

Choose your learning style10 modes available
Mental Model
We want to check if there is a path from the top of the tree to any bottom leaf where the numbers add up to a target sum.
Analogy: Imagine walking down a tree from the top to the bottom, adding numbers on each branch. We want to see if any path adds up exactly to a certain number, like counting steps to reach a treasure.
    5
   / \
  4   8
 /   / \
11  13  4
/  \      \
7    2      1
Dry Run Walkthrough
Input: Tree: 5->4->11->7 (leaf), target sum = 22
Goal: Find if any root-to-leaf path sums to 22
Step 1: Start at root node 5, current sum needed is 22
5 (need 22)
Why: We begin at the top and want to find a path that sums to 22
Step 2: Go left to node 4, subtract 5 from sum, now need 17
5 -> [4] (need 17)
Why: We move down left branch, updating the remaining sum needed
Step 3: Go left to node 11, subtract 4 from sum, now need 13
5 -> 4 -> [11] (need 13)
Why: Continue down left branch, updating sum needed
Step 4: Go left to node 7, subtract 11 from sum, now need 2
5 -> 4 -> 11 -> [7] (need 2)
Why: Move to leaf candidate, check if sum matches
Step 5: Node 7 is leaf but need 2, path sum not matched, backtrack
5 -> 4 -> 11 -> 7 (leaf, need 2)
Why: Leaf reached but sum does not match, so this path fails
Step 6: Go right to node 2 from 11, subtract 11 from sum, now need 2
5 -> 4 -> 11 -> [2] (need 2)
Why: Try other leaf on this branch
Step 7: Node 2 is leaf and need is 2, path sum matched
5 -> 4 -> 11 -> 2 (leaf, need 2)
Why: Found a path where sum matches target
Result:
5 -> 4 -> 11 -> 2 -> null (path sum 22 found)
Annotated Code
DSA Go
package main

import "fmt"

// TreeNode defines a node in the binary tree
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

// hasPathSum checks if there is a root-to-leaf path with given sum
func hasPathSum(root *TreeNode, targetSum int) bool {
    if root == nil {
        return false
    }
    // If leaf node, check if value equals targetSum
    if root.Left == nil && root.Right == nil {
        return root.Val == targetSum
    }
    // Recursively check left and right subtrees with reduced sum
    return hasPathSum(root.Left, targetSum-root.Val) || hasPathSum(root.Right, targetSum-root.Val)
}

func main() {
    // Build tree from dry run example
    root := &TreeNode{Val: 5}
    root.Left = &TreeNode{Val: 4}
    root.Right = &TreeNode{Val: 8}
    root.Left.Left = &TreeNode{Val: 11}
    root.Left.Left.Left = &TreeNode{Val: 7}
    root.Left.Left.Right = &TreeNode{Val: 2}
    root.Right.Left = &TreeNode{Val: 13}
    root.Right.Right = &TreeNode{Val: 4}
    root.Right.Right.Right = &TreeNode{Val: 1}

    targetSum := 22
    fmt.Println(hasPathSum(root, targetSum))
}
if root == nil { return false }
handle empty node - no path here
if root.Left == nil && root.Right == nil { return root.Val == targetSum }
check if leaf node matches remaining sum
return hasPathSum(root.Left, targetSum-root.Val) || hasPathSum(root.Right, targetSum-root.Val)
recurse left and right with updated sum, return true if any path matches
OutputSuccess
true
Complexity Analysis
Time: O(n) because we visit each node once in the worst case
Space: O(h) where h is tree height due to recursion stack
vs Alternative: Compared to iterative BFS, recursion is simpler but uses call stack; BFS uses queue and may use more memory for wide trees
Edge Cases
Empty tree
Returns false because no paths exist
DSA Go
if root == nil {
        return false
    }
Single node tree where node value equals target sum
Returns true because root is leaf and matches sum
DSA Go
if root.Left == nil && root.Right == nil {
        return root.Val == targetSum
    }
Single node tree where node value does not equal target sum
Returns false because no matching path
DSA Go
if root.Left == nil && root.Right == nil {
        return root.Val == targetSum
    }
When to Use This Pattern
When asked if a root-to-leaf path sums to a target, use recursion to subtract node values and check leaves for exact match.
Common Mistakes
Mistake: Checking sum only at nodes, not at leaves, causing false positives
Fix: Only confirm sum match when at leaf nodes (no children)
Mistake: Not subtracting current node value from target sum before recursion
Fix: Pass targetSum - root.Val to recursive calls
Summary
Checks if any root-to-leaf path in a binary tree sums to a target value.
Use when you need to verify if a path with a specific sum exists from top to bottom.
The key is to subtract node values as you go down and confirm sum only at leaf nodes.

Practice

(1/5)
1. What does the "Path Sum Root to Leaf" problem ask you to find in a binary tree?
easy
A. If there exists a root-to-leaf path with a sum equal to a given target
B. The maximum depth of the binary tree
C. The total number of leaf nodes in the tree
D. The sum of all node values in the tree

Solution

  1. Step 1: Understand the problem statement

    The problem asks if there is any path from the root node down to any leaf node where the sum of the node values equals a given target sum.
  2. Step 2: Differentiate from other tree properties

    It is not about counting leaves, finding max depth, or summing all nodes, but specifically about a path sum from root to leaf.
  3. Final Answer:

    If there exists a root-to-leaf path with a sum equal to a given target -> Option A
  4. Quick Check:

    Path sum = target? [OK]
Hint: Focus on root-to-leaf paths, not entire tree sums [OK]
Common Mistakes:
  • Confusing path sum with total tree sum
  • Checking paths that don't end at leaf nodes
  • Ignoring the root node in the sum
2. Which of the following Go function signatures correctly represents a function to check path sum in a binary tree node defined as type TreeNode struct { Val int; Left, Right *TreeNode }?
easy
A. func hasPathSum(root TreeNode, sum int) bool
B. func hasPathSum(root *TreeNode, sum int) bool
C. func hasPathSum(root *TreeNode, sum int) int
D. func hasPathSum(root TreeNode, sum int) int

Solution

  1. Step 1: Identify correct parameter types

    The root node should be passed as a pointer to TreeNode to allow nil checks and avoid copying the entire node.
  2. Step 2: Identify correct return type

    The function should return a boolean indicating if such a path exists, not an integer.
  3. Final Answer:

    func hasPathSum(root *TreeNode, sum int) bool -> Option B
  4. Quick Check:

    Pointer param + bool return = correct signature [OK]
Hint: Use pointer receiver and bool return for path existence [OK]
Common Mistakes:
  • Passing TreeNode by value instead of pointer
  • Returning int instead of bool
  • Using incorrect parameter order
3. What is the output of the following Go code snippet?
package main

import "fmt"

type TreeNode struct {
  Val int
  Left, Right *TreeNode
}

func hasPathSum(root *TreeNode, sum int) bool {
  if root == nil {
    return false
  }
  if root.Left == nil && root.Right == nil {
    return root.Val == sum
  }
  return hasPathSum(root.Left, sum-root.Val) || hasPathSum(root.Right, sum-root.Val)
}

func main() {
  root := &TreeNode{5, &TreeNode{4, &TreeNode{11, &TreeNode{7, nil, nil}, &TreeNode{2, nil, nil}}, nil}, &TreeNode{8, &TreeNode{13, nil, nil}, &TreeNode{4, nil, &TreeNode{1, nil, nil}}}}
  fmt.Println(hasPathSum(root, 22))
}
medium
A. Compilation error
B. false
C. Runtime panic
D. true

Solution

  1. Step 1: Trace the path sums in the tree

    Check if any root-to-leaf path sums to 22. One path is 5->4->11->2 = 22, so the function returns true.
  2. Step 2: Confirm function logic correctness

    The function correctly checks leaf nodes and recursively subtracts node values from sum, returning true if any path matches.
  3. Final Answer:

    true -> Option D
  4. Quick Check:

    Path 5+4+11+2 = 22 [OK]
Hint: Look for any root-to-leaf path summing to target [OK]
Common Mistakes:
  • Ignoring leaf node condition
  • Not subtracting node value from sum
  • Assuming sum must be at root only
4. The following Go function is intended to check if a path sum exists but has a bug. What is the bug?
func hasPathSum(root *TreeNode, sum int) bool {
  if root == nil {
    return false
  }
  if root.Left == nil && root.Right == nil {
    return sum == root.Val
  }
  return hasPathSum(root.Left, sum-root.Val) && hasPathSum(root.Right, sum-root.Val)
}
medium
A. Using && instead of || causes incorrect results
B. Missing base case for nil root
C. Incorrect comparison order in leaf check
D. Not subtracting root.Val from sum in recursive calls

Solution

  1. Step 1: Analyze recursive return condition

    The function uses logical AND (&&) to combine left and right subtree results, which requires both to be true.
  2. Step 2: Understand correct logic for path sum

    We want to return true if either left or right subtree has a valid path, so logical OR (||) should be used instead.
  3. Final Answer:

    Using && instead of || causes incorrect results -> Option A
  4. Quick Check:

    Use OR (||) to find any valid path [OK]
Hint: Use OR (||) to combine subtree results, not AND (&&) [OK]
Common Mistakes:
  • Using AND instead of OR in recursive calls
  • Forgetting to check leaf nodes properly
  • Not handling nil root correctly
5. Given a binary tree where node values can be negative, zero, or positive, which modification is necessary to correctly check for a path sum equal to a target value?
hard
A. Only consider paths with positive sums
B. Stop recursion early if sum becomes negative
C. No modification needed; the standard path sum check works for all values
D. Use breadth-first search instead of depth-first search

Solution

  1. Step 1: Understand path sum logic with negative values

    The standard recursive approach subtracts node values from sum and checks leaf nodes; negative values do not break this logic.
  2. Step 2: Evaluate unnecessary optimizations

    Stopping early on negative sums or ignoring negative paths can miss valid paths; BFS is not required for correctness.
  3. Final Answer:

    No modification needed; the standard path sum check works for all values -> Option C
  4. Quick Check:

    Standard DFS works with negatives [OK]
Hint: Standard DFS path sum works regardless of node values sign [OK]
Common Mistakes:
  • Stopping recursion on negative sums
  • Ignoring negative or zero values in paths
  • Switching to BFS unnecessarily
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard