0x01, 问题简述
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
0x02,示例
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
0x03,题解思路
找到所有路径,进行解决
0x04,题解程序
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class PathSumTest {
public static void main(String[] args) {
TreeNode t1 = new TreeNode(5);
TreeNode t2 = new TreeNode(4);
TreeNode t3 = new TreeNode(8);
TreeNode t4 = new TreeNode(11);
TreeNode t5 = new TreeNode(13);
TreeNode t6 = new TreeNode(4);
TreeNode t7 = new TreeNode(7);
TreeNode t8 = new TreeNode(2);
TreeNode t9 = new TreeNode(5);
TreeNode t10 = new TreeNode(1);
t1.left = t2;
t1.right = t3;
t2.left = t4;
t3.left = t5;
t3.right = t6;
t4.left = t7;
t4.right = t8;
t6.left = t9;
t6.right = t10;
int sum = 22;
List<List<Integer>> listList = pathSum(t1, sum);
System.out.println("listList = " + listList);
}
public static List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> listList = new ArrayList<>();
if (root == null) {
return listList;
}
List<String> paths = new ArrayList<>();
LinkedList<TreeNode> deque = new LinkedList<>();
LinkedList<String> path_back = new LinkedList<>();
deque.add(root);
path_back.add(Integer.toString(root.val));
TreeNode treeNode;
String path;
while (!deque.isEmpty()) {
treeNode = deque.pollLast();
path = path_back.pollLast();
if (treeNode.left == null && treeNode.right == null) {
paths.add(path);
}
if (treeNode.left != null) {
deque.add(treeNode.left);
path_back.add(path + "," + treeNode.left.val);
}
if (treeNode.right != null) {
deque.add(treeNode.right);
path_back.add(path + "," + treeNode.right.val);
}
}
paths.stream().map(str -> str.split(",")).forEachOrdered(split -> {
if (Stream.of(split).filter(Objects::nonNull).
filter(x -> !"".equals(x)).mapToInt(Integer::parseInt).sum() == sum) {
List<Integer> list = new ArrayList<>();
for (String s : split) {
list.add(Integer.parseInt(s));
}
listList.addAll(Collections.singleton(list));
}
});
return listList;
}
}
0x05 ,题解程序图片版
0x06,总结
我的文章基本上都很少再内容上去过多强调重要性了,你觉得重要它就重要,相比于以往的文章去给与读者或者自己去强调有多么重要,后面单独想想其实没有吧必要去这样说,于己于他都没有意义,主动感觉他重要,去做就可以了,这是自己的一点内容。