题目描述
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
关联题目
思路
由于题目中指出路径方向必需是向下的,所以一定是从根节点加上某一个叶子节点的和。
可以从上到下,或者从下到上返回所有可能的和。
需要的节点一定是连续的。
当到达一个节点的时候,可以把此节点与前面所有可能的和加起来。同时再把自己加进去。
有这样一个过程:
比如示例1中的2节点。
if 2 == targetSum:
sum_count+=1;
2 + 5 = ?
2 + 15 = ?
#计算完之后,把自己插入到历史数据的后面。
#下面计算1节点
if 1 == targetSum:
sum_count += 1;
1 + 2 = ?
1 + 7 = ?
1 + 17 = ?
尝试1 递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int pathSum(TreeNode* root, int targetSum) {
int sum_count = 0;
std::function<void(TreeNode *, std::vector<int>)> dfs = [&](TreeNode *node,
std::vector<int> his) {
if (!node)
return;
if(node->val == targetSum) {
sum_count ++;
}
for (auto it = his.begin(); it != his.end(); it++) {
int sum = *it + node->val;
if (sum == targetSum) {
sum_count++;
}
*it = sum;
}
// push back a new node add from 0 + val.
his.push_back(node->val);
dfs(node->left,his);
dfs(node->right,his);
};
dfs(root, std::vector<int>());
return sum_count;
}
};