剑指offer47

226 阅读1分钟

题目描述

输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

解题思路分析

很明显,这道题又是一道经典的回溯题:

  • 当遍历道某一个节点时,判断该节点是否为叶子节点而且该节点的值是否跟当前的target符合,如果都符合,则将该路径加入进去
  • 然后递归将该节点的左右子节点放进去
  • 最后不要忘了将当前节点退出当前list

代码实现

public ArrayList<ArrayList<Integer>> findPath(TreeNode root,int target) {
    if(root == null) {
        return null;
    }
    ArrayList<ArrayList<Integer>> listAll = new ArrayList<>();
    ArrayList<Integer> list = new ArrayList<>();
    findOnePath(root, target, listAll, list);
    return listAll;
}

private void findOnePath(TreeNode node, int target, ArrayList<ArrayList<Integer>> listAll, ArrayList<Integer> list) {
    list.add(node.val);
    if (isLeaf(node)) {
        if (target == node.val) {
            ArrayList<Integer> temp = new ArrayList<>(list);
            listAll.add(list);
        }
    }
    if (node.left != null) {
        findOnePath(node.left, target - node.val, listAll, list);
    }
    if (node.right != null) {
        findOnePath(node.right, target - node.val, listAll, list);
    }
    list.remove(list.size() - 1);
}

private boolean isLeaf(TreeNode root) {
    return root.left == null && root.right == null;
}