题目
DFS
int sum;
List<List<Integer>> finalList;
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
if (root == null) {
return new ArrayList<>();
}
sum = targetSum;
finalList = new ArrayList<>();
// DFS
digui(new ArrayList<>(), root);
return finalList;
}
private void digui(List<Integer> sumList, TreeNode root) {
sumList.add(root.val);
if (root.left == null && root.right == null) {
if (sumList.stream().mapToInt(Integer::intValue).sum() == sum) {
List<Integer> temp = new ArrayList<>();
temp.addAll(sumList);
finalList.add(temp);
return;
}
}
// 做出选择
if (root.left != null) {
digui(sumList, root.left);
// 撤销选择
sumList.remove(sumList.size() - 1);
}
// 做出选择
if (root.right != null) {
digui(sumList, root.right);
// 撤销选择
sumList.remove(sumList.size() - 1);
}
}
思路
(1) 只能从根节点到子叶节点, 因此DFS更合适
(2) 注意每次做出选择的条件, 如果是不会添加sumList的选择, 不要选择, 不然撤销选择那里无法正确撤销