题目分析:
从根节点到叶子节点的带权路径之和等于目标值的情况,才会将这一整个数值列表添加到集合。
那么我们不妨反过来思考:目标值减去这一条路径的带权路径之和刚好为零,则添加到集合中。
代码部分:
class Solution {
LinkedList<List<Integer>> res = new LinkedList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
dfs(root,targetSum);
return res;
}
public void dfs(TreeNode root, int tar) {
if(root == null) { //递归回溯的出口
return;
}
path.add(root.val);
tar -= root.val;
if(tar == 0 && root.left==null && root.right == null) { //当目标值累减到当前节点刚好为零,并且当前节点刚好为叶子节点
res.add(new LinkedList<Integer>(path));
}
dfs(root.left,tar);
dfs(root.right,tar);
path.removeLast(); //减去最后一个节点,进行回溯。
}
}
代码分析:
1.我们在外部定义一个数组链表集合,和一个储存该链表集合的集合。
2.封装一个方法,进行深度优先搜素和回溯。方法的参数开始为根节点和目标值,根节点左右递归,目标值在递归的基础上进行累减,当满足目标值累减到当前节点刚好为零,并且当前节点刚好为叶子节点时,res 动态的添加以满足要求的path.
特别注意 path.removeLast(); 指每次减去最后一个节点,进行回溯,以筛选所有满足的情况。