Problem
You are given a binary tree in which each node contains an integer value.
Find the number of paths that sum to a given value.
The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes).
The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000.
Example
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
10
/ \
5 -3
/ \ \
3 2 11
/ \ \
3 -2 1
Return 3. The paths that sum to 8 are:
5 -> 3
5 -> 2 -> 1
-3 -> 11
Algorithm
整理一下题意:给定一棵二叉树和一个整数sum,要求在二叉树中找到使得和为sum的所有路径,返回路径的数目。路径的起点可以是树的任意节点。假设这棵二叉树的节点数不超过1000,且所有节点的值在[-1000000,1000000]内。
先考虑特定的起始节点。从该节点出发,若该节点为NULL,则直接返回;若sum等于当前节点的值,则路径数加一。然后选中当前节点,考虑其子节点。对左子和右子分别递归调用findSum函数,注意传入的参数sum需要设置为sum-root->val,表示当前节点选中。
然后考虑对二叉树中的每个节点遍历。
注意,若当前节点的值恰好等于sum,则路径数加一,但是接下来不能直接退出该节点的查找过程。因为从该节点向下,存在一种可能,即该节点的子节点路径之和恰好为0,则这些子节点路径与该节点又组成了一条新的路径。
代码如下。
class Solution {
public:
int pathSum(TreeNode* root, int sum) {
if(root==NULL) return 0;
findSum(root,sum);
pathSum(root->left,sum);
pathSum(root->right,sum);
return psum;
}
void findSum(TreeNode* root,int sum){
if(root==NULL) return;
if(sum==root->val){
psum++;
}
findSum(root->left,sum-root->val);
findSum(root->right,sum-root->val);
}
private:
int psum=0;
};