
java
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 {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> list = new ArrayList();
List<Integer> tempList = new ArrayList(); // 存放符合条件的节点
dfs(list, tempList, root, targetSum);
return list;
}
static void dfs(List<List<Integer>> list, List<Integer> tempList, TreeNode root, int targetSum) {
if (root == null) return;
targetSum -= root.val; // 减去该节点
tempList.add(root.val); // 将当前节点加入tempList
if (root.left == null && root.right == null && targetSum == 0) list.add(new ArrayList(tempList)); // 判断是否为叶子节点,如果累积减去的值等于目标值则将tempList创建副本添加到list,一定要创建副本再存入防止tempList改变影响到list
dfs(list, tempList, root.left, targetSum);
dfs(list, tempList, root.right, targetSum);
tempList.remove(tempList.size() - 1); // 回溯重置状态,撤回当前节点的存入
}
}
或者用队列:
java
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> list = new ArrayList();
Deque<Integer> tempList = new LinkedList();
dfs(list, tempList, root, targetSum);
return list;
}
static void dfs(List<List<Integer>> list, Deque<Integer> tempList, TreeNode root, int targetSum) {
if (root == null) return;
targetSum -= root.val;
tempList.offerLast(root.val); // 当前节点添加到队尾
if (root.left == null && root.right == null && targetSum == 0) list.add(new LinkedList(tempList));
dfs(list, tempList, root.left, targetSum);
dfs(list, tempList, root.right, targetSum);
tempList.pollLast(); // 回溯重置,移除队尾节点
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~