437. 路径总和 III(树)

方法一:
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值