题目描述
给定一个二叉树的根节点 root
,和一个整数 targetSum
,求该二叉树里节点值之和等于 targetSum
的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:
输入: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出: 3
解释: 和等于 8 的路径有 3 条,如图所示。
示例 2:
输入: root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出: 3
提示:
- 二叉树的节点个数的范围是 [0,1000]
- -109 <= Node.val <= 109
- -1000 <= targetSum <= 1000
代码及注释
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// 主函数,用于递归遍历二叉树并查找路径和等于目标和的路径数量
func pathSum(root *TreeNode, targetSum int) int {
res := 0
// 如果根节点为空,直接返回0
if root == nil {
return res
}
// 调用dfs函数查找当前根节点的路径和等于目标和的路径数量
res = dfs(root, targetSum)
// 递归遍历左子树和右子树
res += pathSum(root.Left, targetSum)
res += pathSum(root.Right, targetSum)
return res
}
// 辅助函数,用于递归遍历二叉树并查找从当前节点开始路径和等于给定和的路径数量
func dfs(root *TreeNode, sum int) int {
res := 0
// 如果当前节点为空,直接返回0
if root == nil {
return res
}
// 获取当前节点的值
val := root.Val
// 如果当前节点的值等于给定的和,路径数量加1
if val == sum {
res++
}
// 递归遍历左子树和右子树,查找路径和等于给定和的路径数量
res += dfs(root.Left, sum - val)
res += dfs(root.Right, sum - val)
return res
}
代码解释
-
主函数
pathSum
:这个函数用于递归遍历二叉树,并对每个节点调用dfs
函数来查找从该节点开始的路径和等于targetSum
的路径数量。 -
辅助函数
dfs
:这个函数用于递归遍历二叉树,并查找从当前节点开始的路径和等于给定和sum
的路径数量。