题目:
给定一个二叉树,找出所有路径中各节点相加总和等于给定目标值
的路径。
一个有效的路径,指的是从根节点到叶节点的路径。
样例:给定一个二叉树,和 目标值 = 5
:
1
/ \
2 4
/ \
2 3
返回:
[
[1, 2, 2],
[1, 4]
]
当访问到某一结点时,把该结点添加到vector<int>上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,把它添加到vector<vector<int>>。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到双亲,重复上述步骤,但要注意将路径上的该结点和路径和中该结点的值删除。
/**
* 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 the root of binary tree
* @param target an integer
* @return all valid paths
*/
vector<vector<int>>vv;
vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) {
vector<int>v;
int s=0;
find(root,target,v,s);
return P;
}
void find(TreeNode *root,int target,vector<int>v,int s)
{
if(root!=NULL)
{
v.push_back(root->val);
s=s+root->val;
if(s==target&&root->left==NULL&&root->right==NULL)
{
P.push_back(v);
}
if(root->left!=NULL)
{
find(root->left,target,v,s);
}
if(root->right!=NULL)
{
find(root->right,target,v,s);
}
s=s-root->val;
v.pop_back();
}
}
};
感悟:
一开始分别采用递归和非递归的方法做了一下该题,但努力了很久都没有将该题做出来,原因主要在与没有将删除路径上的结点处理好。后来参考了别人的答案才将该题做出。
还需思考用非递归的方法如何处理删除结点的问题。