Leetcode113. 路径总和 II
题目:
相似题目:Leetcode112. 路径总和
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
题解:递归,迭代
java代码:
/**
* 递归
*
* @param root
* @param sum
* @return
*/
public static List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> list = new ArrayList<>();
ArrayList<Integer> tmp = new ArrayList<>();
path(root, sum, list, tmp);
return list;
}
private static void path(TreeNode root, int sum, List<List<Integer>> list, ArrayList<Integer> tmp) {
if (root == null) {
return;
}
tmp.add(root.value);
if (root.left == null && root.right == null && sum == root.value) {
// 这里使用 new 的形式是因为初始化后,传进来的数据每次都是更新后的 tmp
list.add(new ArrayList<>(tmp));
}
path(root.left, sum - root.value, list, tmp);
path(root.right, sum - root.value, list, tmp);
// 这里利用了回溯的思想:每次回退上一个节点再寻找另一条边的节点作为新路径
tmp.remove(tmp.size() - 1);
}
/**
* 迭代
*
* @param root
* @param sum
* @return
*/
public static List<List<Integer>> pathSum2(TreeNode root, int sum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
Stack<Pair<TreeNode, Integer>> stack1 = new Stack<>();
stack1.push(new Pair<>(root, sum - root.value));
Stack<List<Integer>> stack2 = new Stack<>();
ArrayList<Integer> list = new ArrayList<>();
list.add(root.value);
stack2.push(list);
while (!stack1.isEmpty()) {
Pair<TreeNode, Integer> pop = stack1.pop();
TreeNode node = pop.getKey();
Integer value = pop.getValue();
List<Integer> pop1 = stack2.pop();
if (node.left == null && node.right == null && value == 0) {
res.add(pop1);
}
if (node.left != null) {
stack1.add(new Pair<>(node.left, value - node.left.value));
List<Integer> list1 = new ArrayList<>();
list1.addAll(pop1);
list1.add(node.left.value);
stack2.push(list1);
}
if (node.right != null) {
stack1.add(new Pair<>(node.right, value - node.right.value));
List<Integer> list2 = new ArrayList<>();
list2.addAll(pop1);
list2.add(node.right.value);
stack2.push(list2);
}
}
return res;
}