/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int> > pathSum(TreeNode *root, int sum) {
vector<vector<int> > ret;
if(!root) return ret;
//postorder traversal
vector<TreeNode *> v;
TreeNode *pNode=root;
TreeNode *pre=0;
while(!v.empty() || pNode)
{
if(pNode)
{
v.push_back(pNode);
pNode=pNode->left;
}
else
{
TreeNode *top=v[v.size()-1];
if(pre==top->right)
{
if(!top->left && !top->right)
{
if(sum==getSum(v))
{
vector<int> result;
for(size_t i=0;i!=v.size();i++)
{
result.push_back(v[i]->val);
}
ret.push_back(result);
}
}
v.pop_back();
pre=top;
}
else
{
pNode=top->right;
pre=0;
}
}
}
return ret;
}
private:
int getSum(vector<TreeNode*> &v)
{
int sum=0;
for(size_t i=0;i!=v.size();i++)
{
sum+=v[i]->val;
}
return sum;
}
};