Path Sum Root to Leaf in Binary Tree in DSA Go - Time & Space Complexity
We want to know how long it takes to check if a path from the root to any leaf adds up to a target sum in a binary tree.
How does the time needed grow as the tree gets bigger?
Analyze the time complexity of the following code snippet.
func hasPathSum(root *TreeNode, targetSum int) bool {
if root == nil {
return false
}
if root.Left == nil && root.Right == nil {
return root.Val == targetSum
}
return hasPathSum(root.Left, targetSum-root.Val) || hasPathSum(root.Right, targetSum-root.Val)
}
This code checks if there is any root-to-leaf path where the sum of node values equals the target sum.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls visiting each node once.
- How many times: Once per node in the tree, covering all paths.
As the number of nodes grows, the function visits each node once, so the work grows proportionally.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 calls |
| 100 | About 100 calls |
| 1000 | About 1000 calls |
Pattern observation: The operations grow linearly with the number of nodes.
Time Complexity: O(n)
This means the time to check the path sum grows directly with the number of nodes in the tree.
[X] Wrong: "The function only checks one path, so it runs in constant time."
[OK] Correct: The function explores all root-to-leaf paths by visiting every node, so it must check many nodes, not just one path.
Understanding how recursive tree traversal scales helps you explain your solution clearly and shows you grasp how algorithms work on trees.
"What if the tree was balanced versus completely skewed? How would the time complexity change?"
Practice
Solution
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.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.Final Answer:
If there exists a root-to-leaf path with a sum equal to a given target -> Option AQuick Check:
Path sum = target? [OK]
- Confusing path sum with total tree sum
- Checking paths that don't end at leaf nodes
- Ignoring the root node in the sum
type TreeNode struct { Val int; Left, Right *TreeNode }?Solution
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.Step 2: Identify correct return type
The function should return a boolean indicating if such a path exists, not an integer.Final Answer:
func hasPathSum(root *TreeNode, sum int) bool -> Option BQuick Check:
Pointer param + bool return = correct signature [OK]
- Passing TreeNode by value instead of pointer
- Returning int instead of bool
- Using incorrect parameter order
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))
}Solution
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.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.Final Answer:
true -> Option DQuick Check:
Path 5+4+11+2 = 22 [OK]
- Ignoring leaf node condition
- Not subtracting node value from sum
- Assuming sum must be at root only
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)
}Solution
Step 1: Analyze recursive return condition
The function uses logical AND (&&) to combine left and right subtree results, which requires both to be true.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.Final Answer:
Using && instead of || causes incorrect results -> Option AQuick Check:
Use OR (||) to find any valid path [OK]
- Using AND instead of OR in recursive calls
- Forgetting to check leaf nodes properly
- Not handling nil root correctly
Solution
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.Step 2: Evaluate unnecessary optimizations
Stopping early on negative sums or ignoring negative paths can miss valid paths; BFS is not required for correctness.Final Answer:
No modification needed; the standard path sum check works for all values -> Option CQuick Check:
Standard DFS works with negatives [OK]
- Stopping recursion on negative sums
- Ignoring negative or zero values in paths
- Switching to BFS unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
