求和路径
描述
给定一个二叉树,设计一个算法,打印节点数值等于某个给定值的所有路径的数量。
注意:
路径不一定是从二叉树的根节点出发或叶节点结束,但其方向必须向下。
样例
输入:[5,4,8,11,null,13,4,7,2,null,null,5,1] sum=22
输出:3
解释:和为22的路径:[5,4,11,2],[5,8,4,5],[4,11,7]
思路
递归
pathSum(TreeNode root, int sum) 从哪个节点开始
dfs(TreeNode root, int sum) 统计该起点下的合法路径数量
代码
public class Main {
public static int pathSum(TreeNode root, int sum) {
if (root==null){
return 0;
}
//总的路径数量=根节点为起点的合法路径数量+左子树的+右子树的
return dfs(root,sum)+pathSum(root.left,sum)+pathSum(root.right,sum);
}
private static int dfs(TreeNode root, int sum) {
if (root==null){
return 0;
}
sum-=root.val;
//合法路径数量
int count =0;
//当sum减为0,说明一条新的合法路径出现了
if (sum==0){
count =1;
}
//当该节点不为叶子节点,则继续统计该节点的左右子树的合法路径数量
return count +dfs(root.left,sum)+dfs(root.right,sum);
}
}