437. Path Sum III

437. Path Sum III

题目描述:不需要从根到叶的,但是要求是需要从上到下的节点,找出所有的路径使得节点的值的和等于目标值,返回路径的个数

核心思想

递归计数的技巧,不需要从根到叶的路径,只不过是将搜索的起点作为每一个起点即可,因此通过搞清楚子问题,很容易就可以将问题转化成给定起点,再递归找寻一条路径即可,利用两个递归嵌套我们可以将结果累加,第一个是起点的选择是一次递归的,还有从起点开始递归寻找路径个数又是一次

class Solution {
public:
    int pathSum(TreeNode* root, int sum) {
        if (!root) return 0;
		// DFS在确定的起点开始搜索计数,pathSum 用来更换地点
        return DFS(root, 0, sum)+pathSum(root->left, sum)+pathSum(root->right, sum);
    }
private:
    int DFS(TreeNode* root, int sum, int &target) {
        if (!root) return 0;
        int curSum=sum+root->val;
		// 相等即为1,然后再搜索左子树以及右子树进行递归计数
        return (curSum==target) + DFS(root->left, curSum, target) + DFS(root->right, curSum, target);
    }
};

收获

  • 递归计数和递归分解问题的思想

#tree