这个题虽然是中等,代码也不多,解法也有很多,但是特别高效的我也没找到。看到了很多双递归解法,确实巧妙。但是我觉得单递归+一次路径遍历效率上应该更高一点。
解法1:
把dfs所有的根节点到叶子节点路径列找到,然后单个路径使用滑动窗口,窗口路径和为sum则计数+1。
解法2:
dfs所有的节点,把每个节点值push进路径中(注意路径切换需要pop节点值),以当前节点为末尾节点,向前遍历路径,找到路径和为sum的路径则计数加1.
代码实现起来,代码2比较好写些,我选了第2种,哈哈
/**
 * 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 FindPath(TreeNode* root, int sum) {
        // write code here
        vector<int> path;
        return FindPathWithPath(root,sum, path);
    }
    
    int FindPathWithPath(TreeNode* root,int sum, vector<int> &path) {
        if(root == NULL){
            return 0;
        }
        int count = 0;
        int left = 0;
        int right = 0;
        int cur = sum;
        path.push_back(root->val);
        for(int i = path.size()-1;i>=0;i--){
            cur = cur - path[i];
            if(cur == 0){
                count++;
            }
        }          
        if(root->left != NULL){
            left = FindPathWithPath(root->left,sum,path);
            path.pop_back();
        }
        
        if(root->right != NULL){
            right = FindPathWithPath(root->right,sum,path);
            path.pop_back();
        }
        return left + right + count; 
    }
};