🔗 leetcode.cn/problems/pa…
题目
- 给一个二叉树,和一个整数 targetSum
- 求二叉树中,路径之和等于 targetSum 的条数,路径方向只能从父节点到子节点
思路
- 解法一:用 mp 计数,dfs 路径上所有出现的和的次数,碰到 targetSum 进行统计
- 解法二:dfs 记录前缀和出现的次数,到当前节点,统计 presum - targetSum 的前缀和的个数,即满足路径和为 targetSum 的条数
代码
/**
* 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 count
long long presum
unordered_map<long long, int> mp
void dfs1(TreeNode* node, int targetSum,unordered_map<long long, int>& curr_mp) {
if (node == nullptr) return
unordered_map<long long, int> tmp_mp
for (auto it = curr_mp.begin()
long long sum = it->first
int cnt = it->second
tmp_mp[sum + node->val] += cnt
}
tmp_mp[node->val]++
if (tmp_mp.find(targetSum) != tmp_mp.end()) {
count += tmp_mp[targetSum]
}
dfs1(node->left, targetSum, tmp_mp)
dfs1(node->right, targetSum, tmp_mp)
}
void dfs2(TreeNode* node, int targetSum) {
if (node == nullptr) return
presum += node->val
if (mp.count(presum - targetSum)) {
count += mp[presum - targetSum]
}
mp[presum]++
dfs2(node->left, targetSum)
dfs2(node->right, targetSum)
mp[presum]--
presum -= node->val
}
int solution1(TreeNode* root, int targetSum) {
dfs1(root, targetSum, mp)
return count
}
int solution2(TreeNode* root, int targetSum) {
mp[0] = 1
presum = 0
dfs2(root, targetSum)
return count
}
int pathSum(TreeNode* root, int targetSum) {
if (root == nullptr) return 0
count = 0
//return solution1(root, targetSum)
return solution2(root, targetSum)
}
}