import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @param targetSum int整型 * @return int整型二维数组 */ public int[][] findPaths(TreeNode root, int targetSum) { List<List<Integer>> paths = new ArrayList<>(); List<Integer> currentPath = new ArrayList<>(); findPathsHelper(root, targetSum, paths, currentPath); // 集合转二维数组返回,返回符合条件的所有路径 int[][] result = new int[paths.size()][]; for (int i = 0; i < paths.size(); i++) { int[] path = new int[paths.get(i).size()]; for (int j = 0; j < paths.get(i).size(); j++) { path[j] = paths.get(i).get(j); } result[i] = path; } return result; } // 用来寻找路径的功能函数,递归主分支和左右子树,然后回溯,主要思想。 private void findPathsHelper(TreeNode root, int targetSum, List<List<Integer>> paths, List<Integer> currentPath) { if (root == null) { return; } currentPath.add(root.val); if (root.left == null && root.right == null && root.val == targetSum) { paths.add(new ArrayList<>(currentPath)); } findPathsHelper(root.left, targetSum - root.val, paths, currentPath); findPathsHelper(root.right, targetSum - root.val, paths, currentPath); currentPath.remove(currentPath.size() - 1); } }
本题知识点分析:
1.二叉树
2.前序遍历
3.深度优先搜索DFS
4.递归
5.回溯
6.数组遍历
7.集合转数组
本题解题思路分析:
1.看着知识点多,但只要会拆分函数,就会比较简单
2.findPathsHelper用来寻找所有符合条件的路径,主要思想是:前序遍历获取该结点的值,存放currentPath这个集合
3.如果某点路径已经走到底,这时候root.left和right都等于null,如果此时又符合条件,满足路径和等于targetSum,那么添加到集合Paths中,其实可以写个全局变量,这里我用的传参,无所谓了,引用类型反正传递的是地址
4.分别遍历左右子树,记得将需要的targetSum-当前的节点值root.val
5.经典回溯,在递归左右子树后,需要将自身节点的值去掉 currentPath.remove(currentPath.size() - 1);
关键:回溯保证了算法能够正确的找出所有满足条件的路径,而不是只找到其中一条路径。
本题使用编程语言: Java
如果对你有帮助,可以点个赞捏,感谢~