LeetCode103|路径总和II

时间:2022-07-28
本文章向大家介绍LeetCode103|路径总和II,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

0x01, 问题简述

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

0x02,示例

示例:
给定如下二叉树,以及目标和 sum = 22,

              5
             / 
            4   8
           /   / 
          11  13  4
         /      / 
        7    2  5   1
返回:

[
   [5,4,11,2],
   [5,8,4,5]
]

0x03,题解思路

找到所有路径,进行解决

0x04,题解程序


import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class PathSumTest {
    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(5);
        TreeNode t2 = new TreeNode(4);
        TreeNode t3 = new TreeNode(8);
        TreeNode t4 = new TreeNode(11);
        TreeNode t5 = new TreeNode(13);
        TreeNode t6 = new TreeNode(4);
        TreeNode t7 = new TreeNode(7);
        TreeNode t8 = new TreeNode(2);
        TreeNode t9 = new TreeNode(5);
        TreeNode t10 = new TreeNode(1);
        t1.left = t2;
        t1.right = t3;
        t2.left = t4;
        t3.left = t5;
        t3.right = t6;
        t4.left = t7;
        t4.right = t8;
        t6.left = t9;
        t6.right = t10;
        int sum = 22;
        List<List<Integer>> listList = pathSum(t1, sum);
        System.out.println("listList = " + listList);


    }

    public static List<List<Integer>> pathSum(TreeNode root, int sum) {
        List<List<Integer>> listList = new ArrayList<>();
        if (root == null) {
            return listList;
        }
        List<String> paths = new ArrayList<>();

        LinkedList<TreeNode> deque = new LinkedList<>();
        LinkedList<String> path_back = new LinkedList<>();
        deque.add(root);
        path_back.add(Integer.toString(root.val));
        TreeNode treeNode;
        String path;
        while (!deque.isEmpty()) {
            treeNode = deque.pollLast();
            path = path_back.pollLast();
            if (treeNode.left == null && treeNode.right == null) {
                paths.add(path);
            }
            if (treeNode.left != null) {
                deque.add(treeNode.left);
                path_back.add(path + "," + treeNode.left.val);
            }
            if (treeNode.right != null) {
                deque.add(treeNode.right);
                path_back.add(path + "," + treeNode.right.val);
            }
        }
        paths.stream().map(str -> str.split(",")).forEachOrdered(split -> {
            if (Stream.of(split).filter(Objects::nonNull).
                    filter(x -> !"".equals(x)).mapToInt(Integer::parseInt).sum() == sum) {
                List<Integer> list = new ArrayList<>();
                for (String s : split) {
                    list.add(Integer.parseInt(s));
                }
                listList.addAll(Collections.singleton(list));
            }
        });
        return listList;
    }
}

0x05 ,题解程序图片版

0x06,总结

我的文章基本上都很少再内容上去过多强调重要性了,你觉得重要它就重要,相比于以往的文章去给与读者或者自己去强调有多么重要,后面单独想想其实没有吧必要去这样说,于己于他都没有意义,主动感觉他重要,去做就可以了,这是自己的一点内容。