思路:
- 用一个变量
path
表示从根节点开始的路劲已经累加的节点值之和,并保存到哈希表中;- 哈希表的键是累加的节点值之和,哈希表的值是每个节点值之和出现的次数;
- 每遍历到一个节点,就把当前节点值累加到
path
中,并增加这个值在哈希表中的出现次数;- 因为
dfs
函数结束时程序会回到当前节点的父节点,所以在返回父节点之前需要将当前节点值从路径中删除,即哈希表中当前路劲值减1。
class Solution {
public:
int pathSum(TreeNode* root, int targetSum) {
unordered_map<int, int> hash;
hash[0] = 1; //初始值为0,有一种情况
return dfs(root, targetSum, hash, 0);
}
int dfs(TreeNode* root, int targetSum, unordered_map<int, int>& hash, int path)
{
if (root == nullptr) return 0;
path += root->val; //累加当前路径值
int count = hash[path - targetSum];
hash[path] ++ ; //增加当前路径值在哈希表中出现的次数
count += dfs(root->left, targetSum, hash, path);
count += dfs(root->right, targetSum, hash, path);
//当前节点的左右子节点都已经遍历完毕,在返回父节点前还原现场
hash[path] -- ;
return count;
}
};