经典问题:DFS + 回溯
C++ 代码
class Solution {
public:
vector<vector<int>> ans;
vector<int> temp;
vector<vector<int>> findPath(TreeNode* root, int sum) {
if(!root) return ans;
dfs(root,sum,0,temp);
return ans;
}
void dfs(TreeNode* root,int sum,int target,vector<int> temp)
{
//节点为空,直接返回
if(!root) return;
//每次都先把目标值加上当前节点值
target+=root->val;
//如果是叶子节点并且和等于目标值,temp加入到数组ans中
if(!root->left && !root->right && sum==target)
{
temp.push_back(root->val);
ans.push_back(temp);
return ;
}
//如果有左孩子,就去遍历左孩子的情况
if(root->left)
{
temp.push_back(root->val);
dfs(root->left,sum,target,temp);
//回溯
temp.pop_back();
}
//如果有右孩子,就去遍历右孩子的情况
if(root->right)
{
temp.push_back(root->val);
dfs(root->right,sum,target,temp);
//回溯
temp.pop_back();
}
}
};