题目:
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
For example:Given the below binary tree and
sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
return
[ [5,4,11,2], [5,8,4,5] ]代码和思路:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<int> fa;
vector<vector<int>> ans;
help(root, sum, fa, ans );
return ans;
}
下面是传值:
void help(TreeNode* root, int sum, vector<int> &father, vector<vector<int>>& ans)
{
if(root == NULL) return ;
vector<int> temp(father);
temp.push_back(root->val);
if(root->left == NULL && root->right == NULL){
if(root->val == sum){
ans.push_back(temp);
}
return ;
}
help(root->left, sum - root->val, temp, ans);
help(root->right, sum - root->val, temp, ans);
}
相当于:
void help(TreeNode* root, int sum, vector<int> father, vector<vector<int>>& ans)
{
if(root == NULL) return ;
/*vector<int> temp(father);
temp.push_back(root->val);*/
father.push_back(root->val);
if(root->left == NULL && root->right == NULL){
if(root->val == sum){
ans.push_back(father);
}
return ;
}
help(root->left, sum - root->val, father, ans);
help(root->right, sum - root->val, father, ans);
}
而对于引用传递的话一定要进行pop操作,注意体会:这里就是
回溯法
void help(TreeNode* root, int sum, vector<int> &father, vector<vector<int>>& ans)
{
if(root == NULL) return ;
father.push_back(root->val);
if(root->left == NULL && root->right == NULL){
if(root->val == sum){
ans.push_back(father);
}
//return ;这里return一定要去掉 注意体会 因为在下面两个help中若找不到(没有root->val == sum)那么就要pop_back.就是一种回溯法
}
help(root->left, sum - root->val, father, ans);
help(root->right, sum - root->val, father, ans);
father.pop_back();
}
最后一个help只要9msAC,说明引用传递效率要高。