题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
1 public class TreeNode { 2 3 int val=0; 4 TreeNode left; 5 TreeNode right; 6 7 public TreeNode(int val) { 8 9 this.val = val;10 }11 12 }
1 public class Solution { 2 ArrayListarrayIN = new ArrayList<>(); 3 ArrayList > arrayOut = new ArrayList >(); 4 //注意:这俩个数组声明要放在函数外面,因为他们是不能参与递归的操作的,不然都是new对象了(我就犯傻了) 5 //还有下面这个数组声明的泛型格式注意下 6 7 public ArrayList > FindPath(TreeNode root, int target) { 8 9 if (root == null) {10 return arrayOut;11 }12 13 arrayIN.add(root.val);14 15 target = target - root.val; // 求剩余路径的长度和16 17 if (target == 0 && root.left == null && root.right == null) {18 19 arrayOut.add(new ArrayList<>(arrayIN)); // 新建一个满足条件的数组并放入数组中20 21 }22 23 FindPath(root.left, target); // 递归左子树24 FindPath(root.right, target); // 递归右子树25 arrayIN.remove(arrayIN.size() - 1);26 // 这句话的就是在递归回溯的时候,它会移除掉当前arrayIn数组最后一个元素27 // 相当于退回一步,用arrayIn的前一个元素去执行当前递归的上一个递归(画一个递归图回溯就会明了)。28 // 因为这里的arrayIn是共用的,而真正属于自己的是new ArrayList<>(arrayIN)29 30 return arrayOut;31 32 }33 }