路径总和II

123 阅读1分钟

题目

image.png

DFS

int sum;
    List<List<Integer>> finalList;
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return new ArrayList<>();
        }
        sum = targetSum;
        finalList = new ArrayList<>();
        // DFS
        digui(new ArrayList<>(), root);
        return finalList;


    }

    private void digui(List<Integer> sumList, TreeNode root) {
        sumList.add(root.val);
        if (root.left == null && root.right == null) {
            if (sumList.stream().mapToInt(Integer::intValue).sum() == sum) {
                List<Integer> temp = new ArrayList<>();
                temp.addAll(sumList);
                finalList.add(temp);
                return;
            }
        }

        // 做出选择
        if (root.left != null) {
            digui(sumList, root.left);
            // 撤销选择
            sumList.remove(sumList.size() - 1);
        }


        // 做出选择
        if (root.right != null) {
            digui(sumList, root.right);
            // 撤销选择
            sumList.remove(sumList.size() - 1);
        }

    }
   

思路

(1) 只能从根节点到子叶节点, 因此DFS更合适

(2) 注意每次做出选择的条件, 如果是不会添加sumList的选择, 不要选择, 不然撤销选择那里无法正确撤销