/** 看了几位同学的代码后,才最后写出来,但不是用了别人的,是按照自己的代码风格写的 这道题的思路无非是树的深度优先遍历 我的思路是递归:递归方法是返回当前路径下匹配目标值的路径。 目标值 = 目标值 - 当前节点值 共有几种情况: 0,当节点为空,return 1,当目标值小于0,return 2,当目标值为0 并且 节点下无其他节点 节点下无其他节点说明是叶子节点,并且路径值的和满足了目标值,添加到结果中 并且return 3,当目标值大于0,继续递归 */ public class Solution { public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if (root == null){ return result; } ArrayList<Integer> path = new ArrayList<>(); this.find(root, target, result, path); return result; } private void find(TreeNode root, int target, ArrayList<ArrayList<Integer>> result, ArrayList<Integer> path) { // 0,当节点为空,return if (root == null) { return; } path.add(root.val); target -= root.val; // 1,当目标值小于0,return if(target < 0){ return; } // 2,当目标值为0 并且 节点下无其他节点, 保存并返回 if(target == 0 && root.left == null && root.right == null){ result.add(path); return; } // 继续遍历左右节点 // 这里new path是因为左右都会在下次递归path.add(root.val); this.find(root.left, target, result, new ArrayList<>(path)); this.find(root.right, target, result, new ArrayList<>(path)); } @Test public void test() { TreeNode t10 = new TreeNode(10); TreeNode t5 = new TreeNode(5); TreeNode t12 = new TreeNode(12); TreeNode t7 = new TreeNode(7); t10.left = t12; t10.right = t5; t5.right = t7; ArrayList<ArrayList<Integer>> res = FindPath(t10, 22); for (ArrayList<Integer> path : res) System.out.println(path); } private class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } }