原题链接:二叉树中和为某一值的路径(一)_牛客题霸_牛客网
描述:
给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。
1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点
2.总节点数目为n
3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)
数据范围:
0<=n<=10000<=n<=1000
-10^9<=节点值<=10^9−109<=节点值<=109
假如二叉树root为{1,2,3,4,5,4,3,#,#,-1},sum=6,那么总共如下所示,有3条路径符合要求
解题思路:
首先二叉树肯定是递归的方案去找,每个节点都要进行三种判断:
1.自身是否满足
2.左节点满足数量
3.右节点满足数量
三者相加就是总数量。
我们以左节点为例,判断左节点数量的时候,存在两种场景。
场景一:要带着parent节点判断是否满足。这时,sum求和值只能等于parentSum-root.val;
场景二:不带parent节点判断是否满足。这时候就有就继续存在两种可能。
1.不带parent节点继续判断是否等于sum
2.带着parent节点判断是否等于sum,这时候sum=parentSum-root.val;
根节点时,默认肯定时不带parent节点判断,因为它没有parent节点。
代码:
public int FindPath(TreeNode root, int sum) {
return FindPathByRoot(root, sum, false);
}
/**
* 每一个root都返回
*
* @param root
* @param sum
* @param isHaveRootValue 是否包含上一节点的值,如果包含,则只有一种情况sum=sum-root.val
* @return
*/
private int FindPathByRoot(TreeNode root, int sum, boolean isHaveRootValue) {
if (root == null) {
return 0;
}
int count = 0;
if (root.val == sum) {
count++;
}
if (root.left != null) {
if (!isHaveRootValue) {
count = count + FindPathByRoot(root.left, sum, false);
}
count = count + FindPathByRoot(root.left, sum - root.val, true);
}
if (root.right != null) {
if (!isHaveRootValue) {
count = count + FindPathByRoot(root.right, sum, false);
}
count = count + FindPathByRoot(root.right, sum - root.val, true);
}
return count;
}