算法:
算法采用递归,核心在于如何找到递归的终止条件,具体步骤如下:
1.采用递归的方式,sum的数值要随着遍历过的节点做递减操作,sum = sum-root.Val2.递归的终止条件sum==0是其中之一,如果要求是叶子节点的也需要加上
题目1:
https://leetcode-cn.com/problems/path-sum/
![]()
代码实现:
func hasPathSum(root *TreeNode, sum int) bool { if root == nil { return false } if root.Left == nil && root.Right == nil { return sum == root.Val } res := sum - root.Val if hasPathSum(root.Left,res) { return true } if hasPathSum(root.Right,res) { return true } return false}
执行结果:
![]()
题目2:
https://leetcode-cn.com/problems/path-sum-ii/
![]()
代码实现:
var res [][]intfunc pathSum(root *TreeNode, sum int) [][]int { res = [][]int{} if root == nil { return nil } var tmp []int dfs(root,sum,tmp) return res}func dfs(root *TreeNode, sum int, tmp []int) { if root == nil { return } tmp = append(tmp,root.Val) if sum == root.Val && root.Left == nil && root.Right == nil { r := make([]int, len(tmp)) copy(r, tmp) res = append(res, r) return } dfs(root.Left,sum-root.Val,tmp) dfs(root.Right,sum-root.Val,tmp) return }
执行结果:
![]()
题目3:
https://leetcode-cn.com/problems/path-sum-iii/
![]()
代码实现:
func pathSum(root *TreeNode, sum int) int { if root == nil { return 0 } result := countPath(root,sum) result += pathSum(root.Left,sum) result += pathSum(root.Right,sum) return result}func countPath(root *TreeNode, sum int) int { if root == nil { return 0 } count := 0 res := sum - root.Val if res == 0 { count = 1 } return count + countPath(root.Left,res) + countPath(root.Right,res)}
执行结果:
![]()