题目:https://leetcode.cn/problems/path-sum-ii/description/
这道题目是二叉树的经典回溯题目。既然要博爱村路径,那就得前序(中左右)递归遍历,代码如下:
有几个细节需要注意:
- 因为节点的值可能是负值,所以必须要遍历到叶节点才行,无法剪枝;
- 路径参数 path 采用地址传参,无需复制,但是要加上 pop_back 才行;
- 找到答案后,不要忘了 pop_back,因为下面直接返回了。
class Solution {
public:
vector<vector<int>> ans;
void backtracking(TreeNode* root, vector<int>& path, int target) {
if (!root) {
return;
}
// 访问根节点
path.push_back(root->val);
target -= root->val;
// 判断
if (target == 0 && !root->left && !root->right) {
ans.push_back(path);
// 不要忘记出栈
path.pop_back();
return;
}
backtracking(root->left, path, target);
backtracking(root->right, path, target);
path.pop_back();
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<int> path;
backtracking(root, path, targetSum);
return ans;
}
};
下面的代码不使用地址传参,而是复制传参,这样就不需要 pop_back 操作了,同样可以ac,但是速度和内存性能都比较差。
class Solution {
public:
vector<vector<int>> ans;
void backtracking(TreeNode* root, vector<int> path, int target) {
if (!root) {
return;
}
path.push_back(root->val);
target -= root->val;
if (target == 0 && !root->left && !root->right) {
ans.push_back(path);
// path.pop_back();
return;
}
backtracking(root->left, path, target);
backtracking(root->right, path, target);
// path.pop_back();
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<int> path;
backtracking(root, path, targetSum);
return ans;
}
};
思考:如果仅要求找到任意一条符合条件的路径,这样如何剪枝呢?