leetcode.437. 路径总和 III (前缀和 + 回溯 + HashMap)

我不是女神ヾ 2022-10-10 12:54 220阅读 0赞

437. 路径总和 III

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

  1. root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
  2. 10
  3. / \
  4. 5 -3
  5. / \ \
  6. 3 2 11
  7. / \ \
  8. 3 -2 1
  9. 返回 3。和等于 8 的路径有:
  10. 1. 5 -> 3
  11. 2. 5 -> 2 -> 1
  12. 3. -3 -> 11

思路与代码

前缀和 + 回溯 + HashMap

  1. class Solution {
  2. public:
  3. int pathSum(TreeNode* root, int targetSum) {
  4. unordered_map<int, int> worker;
  5. worker[0] = 1;
  6. int res = 0;
  7. dfs(root, 0, worker, res, targetSum);
  8. return res;
  9. }
  10. private:
  11. void dfs(TreeNode *root, int preSum, unordered_map<int, int> &worker, int &res, int target) {
  12. if (!root) return;
  13. preSum += root->val;
  14. // 前缀和的本质是,把一大段数据分成 两段来看,其实中一段存在,另一段就一定存在。
  15. // 在前缀和公式中,当前节点前缀和就是 C , targetSum就是B , 只要知道 A 出现的次数,
  16. // 就知道 B 出现的次数
  17. // 由 A + B = C 得到 C - B = A
  18. res += worker[preSum - target];
  19. // 加入当前前缀和
  20. worker[preSum]++;
  21. dfs(root->left, preSum, worker, res, target);
  22. dfs(root->right, preSum, worker, res, target);
  23. // 回溯
  24. worker[preSum]--;
  25. }
  26. };

参考

发表评论

表情:
评论列表 (有 0 条评论,220人围观)

还没有评论,来说两句吧...

相关阅读

    相关 437. 路径总和 III

    打卡!!!每日一题 今天给大家带来一道深度优先遍历的题目,要知道树的前序遍历就是深度优先遍历,按照这个思路很多题目就会很轻松的解决。 题目描述:[437. 路径总和 III

    相关 437. 路径总和 III

    > 给定一个二叉树,它的每个结点都存放着一个整数值。 > > 找出路径和等于给定数值的路径总数。 > > 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是