知识点
DFS 树形DP 哈希表
思路
树中两点的路径和可以变成这两点到根节点的路径和的差值,我们构造一个dfs函数,来获取从根节点到达当前节点的路径总和,并用一个哈希表来维护已有的不同路径和的个数,那么以当前节点为较下面端点的贡献是mp[cur - sum]
计算完当前贡献后,把当前cur加入mp用于计算下面的节点。
由于DFS的性质可以保证mp里面存储的都是当前节点的祖先节点信息。
AC code(C++)
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ #include <unordered_map> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @param sum int整型 * @return int整型 */ int pathSum(TreeNode* root, int sum) { unordered_map<int, int> mp; int res = 0; function<void(TreeNode*, int)> dfs = [&](TreeNode* root, int cur) { if (!root) return; cur += root->val; res += mp[cur - sum]; mp[cur] += 1; dfs(root->left, cur); dfs(root->right, cur); mp[cur] -= 1; }; mp[0] = 1; dfs(root, 0); return res; } };