题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
1、思路分析
思路为二叉树的深度优先遍历,首先新建两个全局变量分别存储所有合适的路径和当前走过的路径。在FindPath方法中,跳出递归的条件为root==null;对于当前结点,都先添加其值,并使target减去该值;如果此时target为0并且当前结点为叶子结点(左右子树都为空),说明找到了满足要求的路径,将list复制一份添加进result中,如果未找到,则继续遍历其左右子树。左右子树遍历完成后,list一定要回溯到父节点,进行另外一个方向的深度遍历。一开始不理解最后一步回退,是因为没有理解递归函数里的返回操作,返回只会回到调用处,而不是所有递归调用的结束。
2、代码

public class Solution {
    private ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    private ArrayList<Integer> list = new ArrayList<>();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        if(root == null) return result;
        list.add(root.val);
        target -= root.val;
        if(target == 0 && root.left == null && root.right == null) 
            result.add(new ArrayList<Integer>(list));
        else{
            FindPath(root.left,target);
            FindPath(root.right,target);
        }
        list.remove(list.size()-1);
        return result;
    }
}