给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
样例
样例 1:
输入: root = {5,4,8,11,#,13,4,7,2,#,#,5,1}, sum = 22
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
输出: [[5,4,11,2],[5,8,4,5]]
解释:
两条路径之和为 22:
5 + 4 + 11 + 2 = 22
5 + 8 + 4 + 5 = 22
样例 2:
输入: root = {10,6,7,5,2,1,8,#,9}, sum = 18
10
/ \
6 7
/ \ / \
5 2 1 8
\
9
输出: [[10,6,2],[10,7,1]]
解释:
两条路径之和为 18:
10 + 6 + 2 = 18
10 + 7 + 1 = 18
注意事项
叶子节点是指没有子节点的节点。
输入测试数据 (每行一个参数)如何理解测试数据?
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: a binary tree
* @param sum: the sum
* @return: the scheme
*/
vector<vector<int>> pathSum(TreeNode * root, int sum1) {
// Write your code here.
vector<vector<int>> ret;
if(root == NULL)
{
return ret;
}
TreeNode* p = root;
TreeNode* r;
int sum = 0;
bool flag;
stack<TreeNode*> s1;
stack<TreeNode*> s2;
do
{
while(p != NULL)
{
s1.push(p);
s2.push(p);
p = p->left;
} //找到最左下角的节点,这个节点没有左子树
r = NULL;
flag = true;
while(!s1.empty() && flag)
{
p = s1.top();
if(p->right == r)
{
if(p->left == NULL && p->right == NULL) //叶子节点
{
int numtmp = 0;
vector<int> mytmp;
for(int i = 0; i<s1.size(); i++)
{
TreeNode* tmp = s2.top();
numtmp = numtmp + (tmp->val);
mytmp.insert(mytmp.begin(),tmp->val);
s2.pop();
}
if(numtmp == sum1)
{
ret.push_back(mytmp);
}
}
s2 =s1;
p = s1.top();
r = p;
s1.pop();
s2.pop();
}
else
{
p = p->right;
flag = false;
}
}
}while(!s1.empty());
return ret;
}
};