思路
很明显这题应该使用一个递归。首先想到的是定义一个数组,使用DFS遍历整棵树,将一条路径上的节点值全部存入数组,当遍历到叶子节点时,判断此路径的值是否等于targetSum,如果是的,就将此数组存入一个数组数组中。
要特别注意的是,要注意回溯,递归每返回一次,就要将节点删除掉,否则此节点一直在数组中,导致最后输出结果错误
class Solution {
public:
void haspath(TreeNode* root,int targetSum,vector<int>& v,vector<vector<int>> &path)
{
if(root == nullptr) return;
v.push_back(root->val); //每次先将节点值存入数组
if(root->left == nullptr && root->right == nullptr) //遇到叶子节点,判断路径上的值是否等于给定值
{ //若等于,此时数组中存放着路径上的所有节点的值,将此数组存入另一个数组的数组
if(root->val == targetSum)
path.push_back(v);
}
//递归遍历左右子树
haspath(root->left,targetSum-root->val,v,path);
haspath(root->right,targetSum-root->val,v,path);
//每递归完一次,需要将刚存入的节点值删除掉
v.pop_back();
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<vector<int>> path;
vector<int> v;
haspath(root,targetSum,v,path);
return path;
}
};