1.题目描述:
给你二叉树的根节点root和一个整数目标和targetSum,找出所有 从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。
2.层序迭代:跟求所有路径差不多。
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> queue = new LinkedList<>();
Queue<List<Integer>> sum = new LinkedList<>();
queue.offer(root);
List<Integer> l = new ArrayList<>();
l.add(root.val);
sum.offer(l);
while (!queue.isEmpty()) {
TreeNode temp = queue.poll();
List<Integer> sumPath = sum.poll();
if (temp.left == null && temp.right == null) {
int sumValue = 0;
for (int i = 0; i < sumPath.size(); i++) {
sumValue += sumPath.get(i);
}
if (sumValue == targetSum) res.add(sumPath);
}
if (temp.left != null) {
queue.offer(temp.left);
List<Integer> l1 = new ArrayList<>(sumPath);
l1.add(temp.left.val);
sum.offer(l1);
}
if (temp.right != null) {
queue.offer(temp.right);
List<Integer> l2 = new ArrayList<>(sumPath);
l2.add(temp.right.val);
sum.offer(l2);
}
}
return res;
}
}
3.递归回溯:与leetcode257. 二叉树的所有路径几乎一致。
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
List<Integer> list = new ArrayList<>();
backTracking(root, list, res, targetSum);
return res;
}
public void backTracking(TreeNode root, List<Integer> list, List<List<Integer>> res, int targetSum) {
list.add(root.val);
if (root.left == null && root.right == null) {
int sum = 0;
for (int i = 0; i < list.size(); i++) {
sum += list.get(i);
}
if (sum == targetSum) res.add(new ArrayList<>(list));//不能直接加list
return;
}
if (root.left != null) {
backTracking(root.left, list, res, targetSum);
list.remove(list.size() - 1);
}
if (root.right != null) {
backTracking(root.right, list, res, targetSum);
list.remove(list.size() - 1);
}
}
}