地址:https://leetcode-cn.com/problems/path-sum-ii/
这里提供几种写法,希望大家能够看出这些写法的差别。
因为时间原因,我就不具体说明了,有疑问的朋友可以随时给我留言(微信:13671597056),最近比较忙,所以就不多说了哈。
Java 代码:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
Deque<Integer> path = new ArrayDeque<>();
pathSum(root, sum, path, res);
return res;
}
public void pathSum(TreeNode node, int sum, Deque<Integer> path, List<List<Integer>> res) {
if (node == null) {
return;
}
sum -= node.val;
path.addLast(node.val);
if (sum == 0 && node.left == null && node.right == null) {
res.add(new ArrayList<>(path));
// 这里不能 return,要等到 path.removeLast(); 以后
}
if (node.left != null) {
pathSum(node.left, sum, path, res);
}
if (node.right != null) {
pathSum(node.right, sum, path, res);
}
path.removeLast();
}
}
Java 代码:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
public class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
Deque<Integer> path = new ArrayDeque<>();
pathSum(root, sum, path, res);
return res;
}
// 如果使用链表的话,一定要使用 addLast 和 removeLast
// 如果使用 push 和 poll 相应的会在链表的头部操作,就不是我们的本意了
public void pathSum(TreeNode node, int sum, Deque<Integer> path, List<List<Integer>> res) {
if (node == null) {
return;
}
if (node.val == sum && node.left == null && node.right == null) {
path.addLast(node.val);
res.add(new ArrayList<>(path));
path.removeLast();
return;
}
path.addLast(node.val);
pathSum(node.left, sum - node.val, path, res);
path.removeLast();
path.addLast(node.val);
pathSum(node.right, sum - node.val, path, res);
path.removeLast();
}
}
如果每一次往下面传,都传新的列表,那么在叶子结点的地方,就不用再做一次拷贝了。
Java 代码:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
List<Integer> path = new ArrayList<>();
dfs(root, sum, path, res);
return res;
}
private void dfs(TreeNode root, int sum, List<Integer> path, List<List<Integer>> res) {
if (root == null) {
return;
}
path.add(root.val);
sum -= root.val;
if (root.left == null && root.right == null) {
if (sum == 0) {
res.add(path);
return;
}
}
if (root.left != null) {
dfs(root.left, sum, new ArrayList<>(path), res);
}
if (root.right != null) {
dfs(root.right, sum, new ArrayList<>(path), res);
}
}
}
这样写也是可以的。
Java 代码:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
public class Solution4 {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
Deque<Integer> path = new ArrayDeque<>();
pathSum(root, sum, path, res);
return res;
}
// 如果使用链表的话,一定要使用 addLast 和 removeLast
// 如果使用 push 和 poll 相应的会在链表的头部操作,就不是我们的本意了
public void pathSum(TreeNode node, int sum, Deque<Integer> path, List<List<Integer>> res) {
if (node == null) {
return;
}
if (node.val == sum && node.left == null && node.right == null) {
path.addLast(node.val);
res.add(new ArrayList<>(path));
path.removeLast();
return;
}
path.addLast(node.val);
pathSum(node.left, sum - node.val, path, res);
pathSum(node.right, sum - node.val, path, res);
path.removeLast();
}
}
附:以前做的奇奇怪怪的写法(备用,可以不用看,我留给自己学习用的)
Java 代码:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
// 根节点
if (root.left == null && root.right == null) {
if (root.val == sum) {
List<Integer> temp1 = new ArrayList<>();
temp1.add(root.val);
result.add(temp1);
return result;
}
}
List<List<Integer>> leftLists = pathSum(root.left, sum - root.val);
mergeOneAndList(root, leftLists, result);
List<List<Integer>> rightLists = pathSum(root.right, sum - root.val);
mergeOneAndList(root, rightLists, result);
return result;
}
private void mergeOneAndList(TreeNode node, List<List<Integer>> listList, List<List<Integer>> result) {
for (int i = 0; i < listList.size(); i++) {
List<Integer> temp1 = new ArrayList<>();
temp1.add(node.val);
temp1.addAll(listList.get(i));
result.add(temp1);
}
}
}