方法一:
1,思路:
对每个结点,计算从该结点到根节点的路径中有多少条子路(一端必须为当前节点)的元素和 == sum;遍历整棵树,得到总共有多少条路;
2,对于树的题目一般都要遍历
递归前序遍历的结构
public int A(TreeNode root){
if(root == null) return 0;
//插入逻辑
int c = A(root.left);
int d = A(root.right);
return ...c+d;
}
3,解:
/**
* 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) {
return calPathSum(root,sum,new int[1005],0);
}
//array数组用来记录从根节点到当前节点的路径,p表示当前点在array中的位置,本质上也是树的当前层次(由题义路径要求是 从上到下,从父结点到子节点的,不存在同层的路径);
public int calPathSum(TreeNode root, int sum, int[] array, int p){
if(root == null) return 0;
array[p] = root.val;
int cnt = 0;
int curSum = 0;
//计算从当前节点到根节点的路径上 满足data域总和 = sum 的路径的个数
for(int i = p;i>=0;i--){
curSum +=array[i];
if(curSum == sum) cnt++;
}
//到下一层节点后 p 要 +1
int leftCnt = calPathSum(root.left, sum , array, p+1);
int rightCnt = calPathSum(root.right, sum ,array ,p+1);
return cnt+leftCnt+rightCnt;
}
}