题目描述:


给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。
1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点
2.总节点数目为n
3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)

数据范围: 0<=n<=1000
-10^9<=节点值<=10^9

假如二叉树root为{1,2,3,4,5,4,3,#,#,-1},sum=6,那么总共如下所示,有3条路径符合要求

alt


题解1:双层递归


代码

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return int整型
     */
    int result = 0;//结果作为全局变量
    void dfs(TreeNode* root, int sum){
        if(!root) return;//递归出口
        sum-=root->val;
        if(sum == 0){
            result++;
          //注意:这里之后不能返回
        }
        dfs(root->left,sum);
        dfs(root->right,sum);
    }
    int FindPath(TreeNode* root, int sum) {
        // write code here
        if(!root) return result;
        dfs(root,sum);//先从根节点开始进行遍历
        FindPath(root->left,sum);//再遍历左子树,且每次都以左子树节点作为dfs的根节点
        FindPath(root->right,sum);//最后遍历右子树
        return result;
    }
};