题目描述:
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
示例:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
10
/ \
5 -3
/ \ \
3 2 11
/ \ \
3 -2 1
返回 3。和等于 8 的路径有:
1. 5 -> 3
2. 5 -> 2 -> 1
3. -3 -> 11
C++实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//双重递归 思路:首先先序递归遍历每个节点,再以每个节点作为起始点递归寻找满足条件的路径。
class Solution {
public:
int pathSum(TreeNode* root, int sum) {
if(!root) return 0;
return helper(root,0,sum)+pathSum(root->left,sum)+pathSum(root->right,sum);
}
int helper(TreeNode* root,int pre,int sum){
if(!root) return 0;
int cur=pre+root->val;
return (cur==sum)+helper(root->left,cur,sum)+helper(root->right,cur,sum);
}
};
Java实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//双重递归思想
class Solution {
public int pathSum(TreeNode root, int sum) {
if(root==null) return 0;
return helper(root,0,sum)+pathSum(root.left,sum)+pathSum(root.right,sum);
}
private int helper(TreeNode root,int pre,int sum){
if(root==null)
return 0;
int cur=root.val+pre;
return (cur==sum?1:0)+helper(root.left,cur,sum)+helper(root.right,cur,sum);
}
}