题目: 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
*思路(借鉴牛客网友):实质还是树的遍历。在递归的过程中,使用ArrayList记录下路径。
*注意:因为使用了变量记录递归调用处理的当前结点,每当递归调用回退至上一层时,需要将记录中的结点也回退一层,使得两者一致。
1 import java.util.ArrayList; 2 /** 3 public class TreeNode { 4 int val = 0; 5 TreeNode left = null; 6 TreeNode right = null; 7 8 public TreeNode(int val) { 9 this.val = val; 10 11 } 12 13 } 14 */ 15 public class Solution { 16 private ArrayList<Integer> list = new ArrayList<Integer>(); 17 private ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>(); 18 public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { 19 if(root==null) return results; 20 list.add(root.val); 21 target -= root.val; 22 if(target==0&&root.left==null&&root.right==null){
//这里不能直接将list加入results,因为对于results来说list是同一个元素(引用没有变化过),直接加入同样的list会导致后加入的覆盖掉之前的. 23 results.add(new ArrayList<Integer>(list)); 24 } 25 FindPath(root.left, target); 26 FindPath(root.right, target);
//一次调用结束前,将记录的结点回退一层 27 list.remove(list.size()-1); 28 return results; 29 } 30 }