437. 路径总和 III
思路:双重递归
根据题意可得,路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。所以我们求的路径可分为三部分:
(1)当前节点作为头结点的满足条件的路径数量;
(2)当前节点的左子树中满足条件的路径数量
(3)当前节点的右子树中满足条件的路径数量
我们设置helper函数来递归当前节点作为头结点的满足条件的路径数量,每经过一个节点执行sum - root.val,并判断sum是否为0,如果为零的话,则找到满足条件的一条路径。
当root为空时,返回0即可。
class Solution {
public int pathSum(TreeNode root, int sum) {
if (root == null) {
return 0;
}
return helper(root, sum) + pathSum(root.left, sum)
+ pathSum (root.right, sum);
}
private int helper(TreeNode root, int sum) {
if (root == null) {
return 0;
}
sum = sum - root.val;
int res = 0;
if (sum == 0) {
res++;
}
return res + helper(root.left,sum) + helper(root.right,sum);
}
}