题目
代码(首刷自解)
class Solution {
public:
vector<vector<int>> res;
vector<int> tmp;
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
if(!root)
return res;
tmp.push_back(root->val);
backtrack(root, targetSum-root->val);
return res;
}
void backtrack(TreeNode* root, int sum) {
if(sum == 0 && !root->left && !root->right) {
res.push_back(tmp);
return;
}
if(root->left) {
tmp.push_back(root->left->val);
backtrack(root->left, sum-root->left->val);
tmp.pop_back();
}
if(root->right) {
tmp.push_back(root->right->val);
backtrack(root->right, sum-root->right->val);
tmp.pop_back();
}
}
};
代码(8.15 二刷看解析)
这次用的GO语言,关于数组赋值需要用深拷贝才行。
var res [][]int
var tmp []int
func pathSum(root *TreeNode, targetSum int) [][]int {
res = [][]int{}
tmp = []int{}
if root == nil {
return res
}
tmp = append(tmp, root.Val)
dfs(root, targetSum - root.Val)
return res
}
func dfs(root *TreeNode, target int) {
if root.Left == nil && root.Right == nil && target == 0 {
cp := make([]int, len(tmp))
copy(cp, tmp)
res = append(res,cp)
return
}
if root.Left != nil {
tmp = append(tmp, root.Left.Val)
dfs(root.Left, target-root.Left.Val)
tmp = tmp[:len(tmp)-1]
}
if root.Right != nil {
tmp = append(tmp, root.Right.Val)
dfs(root.Right, target-root.Right.Val)
tmp = tmp[:len(tmp)-1]
}
}
代码(9.20 三刷自解)
class Solution {
public:
bool flag = false;
bool hasPathSum(TreeNode* root, int targetSum) {
if(!root)
return false;
dfs(root, targetSum);
return flag;
}
void dfs(TreeNode* root, int target) {
if(flag)
return;
if(!root->left && !root->right) {
if(target == root->val)
flag = true;
return;
}
cout<<root->val<<" ";
if(root->left) dfs(root->left, target-root->val);
if(root->right) dfs(root->right, target-root->val);
}
};