思路:其实说出来也就是一个深度优先搜索的问题而已。
我们可以首先遍历出树的全部结点,然后我们就从中一个一个拿出来进行深度优先搜索,也就是俗称的DFS。DFS的参数就定义为三个参数,一个参数用来存放结点,一个参数用来存放目前已经加了多少的和,还有目标和。
在DFS过程中,我们需要判断的条件无非有那么几个:首先就是本结点是不是空的,如果是就直接结束这个函数;如果我们目前加的和已经和目标i和相同了,我们就让全局变量cnt加1.
注意:有些人会问,为什么sum>targetSum不能作为终止条件呢?因为这里面的元素中会考虑负数的存在,我们如果目前和大于目标和了之后,要是后面有负数可以加上变成目标和,我们岂不是错过了这一种可能呢?所以这个不能作为条件。
还有就是结点有无的判断和是否是目标和的判断一定要分清先后,如果结点不存在在前,我们就需要先加上本结点的元素,然后判断目标和是否一致。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {int cnt=0;List<TreeNode>list=new ArrayList<>();public int pathSum(TreeNode root, int targetSum) {if(root==null)return 0;qianxu(root);for(int i=0;i<list.size();i++){dfs(list.get(i),0,targetSum);}return cnt;}public void dfs(TreeNode t,long sum,int targetSum){if(t==null)return;sum+=t.val;if(sum==targetSum)cnt++;dfs(t.left,sum,targetSum);dfs(t.right,sum,targetSum);}public void qianxu(TreeNode t){if(t==null)return;list.add(t);qianxu(t.left);qianxu(t.right);}
}