参考自:这位博主!
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
返回:
[ [5,4,11,2], [5,8,4,5] ]
解题思路:
主要思路就是深搜。但是要注意几个地方:
(1)怎么回溯?利用vector<int>的pop_back()直接把最后不满足的节点弹出就可以回溯了。
(2)怎么标记当前的节点,防止其被重复搜到?采用中序遍历,在被vector<int>弹出后就不会再被重新搜到了。
(3)一点加速的地方,如果当前节点的左右叶子都被搜过了,那么直接可以把这个节点也删除了。
class Solution {
public:
vector<vector<int>> ans;
vector<int> temp;
vector<vector<int>> pathSum(TreeNode* root, int sum) {//dfs
if(root==NULL)
return ans;
int total=0;
if(temp.empty()==false)
temp.clear();
dfs(root,sum);
return ans;
}
void dfs(TreeNode* root,int sum)
{
if(root==NULL)
return;
if(root->left==NULL&&root->right==NULL)//找到叶子节点
{
temp.push_back(root->val);
//判断这条路径是否满足条件
int total=0;
for(int i=0;i<temp.size();i++)
{
total+=temp[i];
}
if(total==sum)
ans.push_back(temp);
//成不成功都得回溯
temp.pop_back();
return;
}
else
{
temp.push_back(root->val);//中序遍历
dfs(root->left,sum);
dfs(root->right,sum);
temp.pop_back();//这说明分别以当前节点的左叶子和右叶子结尾的路径都不满足题意,故除了pop掉左右两个叶子外,还需把这个节点也pop掉
}
}
};