###### tags: `LeetCode` `Tree` `Recursion` `Medium` # LeetCode #113 [Path Sum II](https://leetcode.com/problems/path-sum-ii/) ### (Medium) 給你二元樹的根節點 root 和一個整數目標和 targetSum ,找出所有 從根節點到葉子節點 路徑總和等於給定目標和的路徑。 葉子節點是指沒有子節點的節點。 --- 宣告一個數組儲存現在路徑上經過的節點, 並且將該數組與目標數遞回傳入, 當某節點為葉子節點且它的值等於目標值時, 將整個數組插入答案數組。 ``` class Solution { public: vector<vector<int>> ans; vector<vector<int>> pathSum(TreeNode* root, int targetSum) { vector<int> tmp; helper(root, targetSum, ans, tmp); return ans; } void helper(TreeNode* node, int targetSum, vector<vector<int>> &ans, vector<int> tmp){ if(!node)return; vector<int> tmp1(tmp); tmp1.push_back(node->val); if(targetSum==node->val&&!node->left&&!node->right){ ans.push_back(tmp1); return; } targetSum-=node->val; if(node->left)helper(node->left, targetSum, ans, tmp1); if(node->right)helper(node->right, targetSum, ans, tmp1); } }; ``` --- 可以看到上面的做法, 因為每一個路徑的節點組合都不同, 所以記錄用的數組不能共用, 原本的作法是傳入暫存數組後複製一份, 但這樣很耗費空間。 LeetCode的作法是傳入參考, 並且在最後pop掉暫存數組的尾端數字, 這樣就不會有互相影響的事情發生了。 ``` class Solution { public: vector<vector<int>> ans; vector<vector<int>> pathSum(TreeNode* root, int targetSum) { vector<int> tmp; helper(root, targetSum, ans, tmp); return ans; } void helper(TreeNode* node, int targetSum, vector<vector<int>> &ans, vector<int> &tmp){ if(!node)return; tmp.push_back(node->val); if(targetSum==node->val&&!node->left&&!node->right){ ans.push_back(tmp); tmp.pop_back(); return; } targetSum-=node->val; if(node->left)helper(node->left, targetSum, ans, tmp); if(node->right)helper(node->right, targetSum, ans, tmp); tmp.pop_back(); } }; ```