给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
题解
树的遍历 + DFS
一个朴素的做法是搜索以每个节点为根的(往下的)所有路径,并对路径总和为 targetSum 的路径进行累加统计。
使用 dfs1 来搜索所有节点,复杂度为 O(n);在 dfs1 中对于每个当前节点,使用 dfs2 搜索以其为根的所有(往下的)路径,同时累加路径总和为 targetSum 的所有路径,复杂度为 O(n)。
class Solution {
private int res=0;
public int pathSum(TreeNode root, int targetSum) {
dfs1(root,targetSum);
return res;
}
private void dfs1(TreeNode root, int targetSum){
if(root==null) return;
dfs2(root,targetSum,root.val);
dfs1(root.left,targetSum);
dfs1(root.right,targetSum);
}
private void dfs2(TreeNode root, int targetSum, int val){
if(val==targetSum) res++;
if(root.left!=null){
dfs2(root.left,targetSum,val+root.left.val);
}
if(root.right!=null){
dfs2(root.right,targetSum,val+root.right.val);
}
}
}
注意
1.为什么要有dfs1和dfs2,不能只有一个dfs2?
答:因为本题要求以任意一个节点为根节点作为起始节点向下搜索,dfs2可以完成从某一个节点向下搜索,而dfs1则是为了找到树中每一个节点,并将其作为起始根节点输送给dfs2。
2.为什么不可以把dfs1写到pathSum里?
答:pathSum需要返回具体的值,dfs1有时需要直接return。