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] ]
class Solution {
void do_once(int sum, vector<pair<TreeNode*, pair<int, vector<int>>>>&paths,
vector<vector<int>>&re)
{
vector<pair<TreeNode*, pair<int, vector<int>>>>newpaths;
for (int i = 0; i < paths.size(); i++)
{
if (paths[i].second.first == sum&&paths[i].first->left == NULL&&
paths[i].first->right == NULL)
re.push_back(paths[i].second.second);
else
{
if (paths[i].first->left != NULL)
{
if (paths[i].second.first + paths[i].first->left->val == sum&&
paths[i].first->left->left == NULL&&
paths[i].first->left->right == NULL)
{
vector<int>tt = paths[i].second.second;
tt.push_back(paths[i].first->left->val);
re.push_back(tt);
}
else
{
vector<int>tt = paths[i].second.second;
tt.push_back(paths[i].first->left->val);
newpaths.push_back(pair<TreeNode*, pair<int, vector<int>>>
(paths[i].first->left, pair<int, vector<int>>(
paths[i].second.first + paths[i].first->left->val,
tt)));
}
}
if (paths[i].first->right != NULL)
{
if (paths[i].second.first + paths[i].first->right->val == sum&&
paths[i].first->right->left == NULL
&&paths[i].first->right->right == NULL)
{
vector<int>tt = paths[i].second.second;
tt.push_back(paths[i].first->right->val);
re.push_back(tt);
}
else
{
vector<int>tt = paths[i].second.second;
tt.push_back(paths[i].first->right->val);
newpaths.push_back(pair<TreeNode*, pair<int, vector<int>>>
(paths[i].first->right, pair<int, vector<int>>(
paths[i].second.first + paths[i].first->right->val,
tt)));
}
}
}
}
paths = newpaths;
}
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>>re;
if (root == NULL)
return re;
vector<pair<TreeNode*, pair<int, vector<int>>>>paths;
vector<int>aa;
aa.push_back(root->val);
paths.push_back(pair<TreeNode*, pair<int, vector<int>>>(root,
pair<int, vector<int>>(root->val, aa)));
while (!paths.empty())
{
do_once(sum, paths, re);
}
return re;
}
};
accepted