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] ]
//method1:递归版本 class Solution{ public: vector<vector<int>> pathSum(TreeNode* root, int sum){ vector<vector<int>> res; vector<int> out; helper(root,sum,out,res); return res; } void helper(TreeNode* node, int sum, vector<int>& out, vector<vector<int>>& res){ if(!node) return; out.push_back(node->val);//1 if(sum == node->val && !node->left && !node->right){ res.push_back(out); } helper(node->left,sum-node->val,out,res); helper(node->right, sum-node->val,out,res); out.pop_back();//由于以上1处是先把val加到vector中,如果不符合需要跳转到上一级,此处需要弹出处理; } }; //迭代版本 //注意:11处要考虑最左节点不是叶子节点,下面还有一个右子节点的情况; //可以参看:https://www.cnblogs.com/grandyang/p/4042156.html class Solution{ public: vector<vector<int>> pathSum(TreeNode* root, int sum){ vector<vector<int>> res; vector<TreeNode*> s; TreeNode *cur = root,*pre = NULL; int val = 0; while(cur || !s.empty()){ while(cur){ s.push_back(cur); val += cur->val; cur = cur->left; } cur = cur->back(); if(!cur->left && !cur->right && val == sum){ vector<int> v; for(auto it : s){ v.push_back(it->val); } res.push_back(v); } if(cur->right && cur->right != pre) cur = cur->right;//11 else{ pre = cur; val -= cur->val; s.pop_back(); cur = NULL; } } return res; } };
怕什么真理无穷,进一寸有一寸的欢喜。---胡适