2020年12月16日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
这道题如果能捋清思路的话,其实也不难,需要注意的就是节点的值可能为负,这一点一定不能忘记~!
代码如下:
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<int> vec;
dfs(root, vec, sum);
return res;
}
// dfs,注意vec为引用
void dfs(TreeNode* root, vector<int> &vec, int tmp){
if(root==nullptr) return;
vec.emplace_back(root->val);
// 相等说明和为sum,题目要求路径包含叶节点,所以还要判断是否为叶节点
if(root->val==tmp && !root->left && !root->right) res.emplace_back(vec);
// 继续遍历左右子树,这里不能写else,是因为路径可能出现这种的:1、2、-3、3,最后两个节点相加为0
// 所以不管上面是否满足条件,这里都要执行
dfs(root->left, vec, tmp - root->val);
dfs(root->right, vec, tmp - root->val);
// 最后别忘了弹出队尾元素,因为要返回上一层了,当前层的元素就不需要了
vec.pop_back();
}
};
参考文献
《剑指offer 第二版》
https://leetcode-cn.com/problems/path-sum-ii/