---
# System prepended metadata

title: 'LeetCode #437 [Path Sum III](https://leetcode.com/problems/path-sum-iii/)'
tags: [Recursion, LeetCode, Medium, Tree]

---

###### tags: `LeetCode` `Tree` `Recursion` `Medium`
# LeetCode #437 [Path Sum III](https://leetcode.com/problems/path-sum-iii/)
### (Medium)(第一次沒做出來)
給定一個二元樹的根節點 root ，和一個整數 targetSum ，求該二元樹里節點值之和等於 targetSum 的 路徑 的數目。

路徑 不需要從根節點開始，也不需要在葉子節點結束，但是路徑方向必須是向下的（只能從父節點到子節點）。
![](https://i.imgur.com/A90uY30.png)
targetSum=8

---
這題需要一個額外函式count輔助, 計算以某個節點為起始節點開始的所有可能和。count函式本身為遞迴函式, 但同時, 原本的pathSum函式也是遞迴函是, 目標為指定所有節點為起始節點。因此, 本題是兩個遞迴函式的搭配題。

---
```
class Solution {
public:
    int ans=0;
    int pathSum(TreeNode* root, int targetSum) {
        if(!root)return 0;
        return count(root, 0, targetSum)+pathSum(root->left, targetSum)+pathSum(root->right, targetSum);
        //這邊的count()是計算以root為起始節點的所有可能數
        //後面兩個pathSum()的目標則是將其左右子節點設為起始節點
        //這樣下一輪遞迴時count()函式就會分別以左右子節點為起始節點計算可能數
    }
    int count(TreeNode* node, int pre, int &target){
        //這個函式的目的則是計算以node為起始節點的所有可能數
        if(!node)return 0;
        int cur=pre+node->val;
        return (cur==target)+count(node->left, cur, target)+count(node->right, cur, target);
    }
};
```