1.题目描述
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
2.解题思路
(1)设以根节点为起点。因为路径方向是向下,所以采取前序遍历的方法遍历节点,遍历节点的过程中对当前节点值用变量temp进行累加。当变量temp==给定数值时,路径数+1。若一直遍历到叶子节点,并且temp!=给定数值,需要将temp-当前叶子节点值。(为了让temp与当前叶子节点的兄弟节点继续累加)。
(2)用前序遍历的方式,以二叉树的每一个节点为起点,使用(1)的算法。
/**
* 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 CarryOut(TreeNode* root, int sum, int temp, int array)
{
if(root==NULL)
return array;
temp+=root->val;
if(temp==sum)
{
array++;
}
if(root->left==NULL&&root->right==NULL&&temp!=sum)
{
temp=temp-root->val;
return array;
}
array=CarryOut(root->left, sum, temp, array);
array=CarryOut(root->right, sum, temp, array);
return array;
}
int Do(TreeNode* root, int sum, int result)
{
result+=CarryOut(root, sum, 0, 0);
if(root->left!=NULL)
result=Do(root->left, sum, result);
if(root->right!=NULL)
result=Do(root->right, sum, result);
return result;
}
int pathSum(TreeNode* root, int sum) {
if(root==NULL)
return NULL;
return Do(root, sum, 0);
}
};