序言:二叉树,dfs,回溯法
剑指P182
思路1:由于需要遍历二叉树的路径,必然需要
回溯
。
回溯的几个传入参数:当前节点、当前路径、当前路径和、目标值,无返回值
由于需要自上而下遍历路径,必然是先入先入栈,则选择 前序遍历-深度优先搜索。
0.回溯的截止条件
- 当前节点为空节点是,return
- 压入当前节点进入路径以及加上其值(前序遍历核心操作)
- 如果当前节点为
叶子节点
,则判断当前路径和是否等于目标,是的话压入全局的结果变量,否则该路径不通
回溯的选择列表
- dfs分别遍历左右节点
- 在返回父调用之前,弹出当前节点
我的代码如下,但现在还有点小问题。先记录在案。忙点儿别的~
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> res;
// dfs,当前节点root,当前路径vector<int>,当前路径之和currSum
void dfs(TreeNode* root,vector<int> &currPath,int &currSum,int sum){
currPath.push_back(root->val);
currSum += root->val;
// 到达叶子节点
if(root->left==NULL && root->right==NULL){
if(currSum==sum){
res.push_back(currPath);
return;
}
}
// 递归调用-> 深度优先遍历
if(root->left!=NULL){
dfs(root->left,currPath,currSum,sum);
}
if(root->right!=NULL){
dfs(root->right,currPath,currSum,sum);
}
// 返回父节点之前,删除该节点,执行回溯
currSum -= currPath.back();
currPath.pop_back();
}
vector<vector<int>> pathSum(TreeNode* root, int sum) {
if(root==NULL) return {};
vector<int> currPath={};
int currSum = 0;
dfs(root,currPath,currSum,sum);
return res;
}
};