用递归函数传递参数的时候要注意:
第一个红框相当于 先执行sum相加,再把sum的复制给下一步的traversal函数,所以回溯的时候要减回去,不然会一直累加。
第二个绿框相当于 直接把相加后结果复制给travelsal函数,traversal函数结束后,sum仍然为原来的值,这也是回溯的过程。
例:LeetCode112题 我的做法
class Solution {
public:
bool traversal(TreeNode* root, int sum, int targetSum){
if (!root -> left && !root -> right && targetSum == sum) return true;
if (!root -> left && !root -> right) return false;
if (root -> left){
if (traversal(root -> left, sum += root -> left -> val, targetSum)) return true;
sum -= root -> left -> val;//展示回溯
}
if (root -> right){
//回溯已在sum + root -> right -> val中,traversal函数结束sum没变。
if (traversal(root -> right, sum + root -> right -> val, targetSum)) return true;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if (root == nullptr) return false;
int sum = 0;
return traversal(root, root -> val, targetSum);
}
};