美文网首页
2021-02-12 113. 路径总和 II

2021-02-12 113. 路径总和 II

作者: 止戈学习笔记 | 来源:发表于2021-02-12 18:33 被阅读0次

    题目地址

    https://leetcode-cn.com/problems/path-sum-ii/

    题目描述

    给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
    
    说明: 叶子节点是指没有子节点的节点。
    
    示例:
    给定如下二叉树,以及目标和 sum = 22,
    
                  5
                 / \
                4   8
               /   / \
              11  13  4
             /  \    / \
            7    2  5   1
    返回:
    
    [
       [5,4,11,2],
       [5,8,4,5]
    ]
    

    思路

    1. 先序遍历二叉树,用List记录遍历的节点,遍历到叶子结点时判断路径和是否等于目标值,相等就复制当前路径到结果集中,从叶子结点往回退时将节点移出List,List中始终只有一条路径。

    题解

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @Author: vividzcs
     * @Date: 2021/2/12 18:08 下午
     */
    public class PathSum {
        public static void main(String[] args) {
            int[] arr = {5,4,8,11,-1,13,4,7,2,-1,-1,5,1};
            NodeTree root = NodeTree.createTree(arr);
            List<List<Integer>> result = new ArrayList<>();
            pathSum(result, root, 22, 0, new ArrayList<>());
    
            for (int i=0; i<result.size(); i++) {
                for (int j=0; j<result.get(0).size(); j++) {
                    System.out.print(result.get(i).get(j) + " ");
                }
                System.out.println();
            }
        }
    
        /**
         * 执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
         * 内存消耗:38.8 MB, 在所有 Java 提交中击败了57.82%的用户
         */
        private static void pathSum(List<List<Integer>> result,
                                                   NodeTree root,
                                                   int sum,
                                                   int currentSum,
                                    List<Integer> currentRoad) {
            if (root != null) {
                currentSum += root.getValue();
                currentRoad.add(root.getValue());
                if (sum == currentSum && root.getLeft() == null && root.getRight() == null){
                    result.add(copyList(currentRoad));
                }
                pathSum(result, root.getLeft(), sum, currentSum, currentRoad);
                pathSum(result, root.getRight(), sum, currentSum, currentRoad);
                currentRoad.remove(currentRoad.size() - 1);
            }
        }
    
        private static List<Integer> copyList(List<Integer> currentRoad) {
            List<Integer> result = new ArrayList<>();
            for (int i=0; i<currentRoad.size(); i++) {
                result.add(currentRoad.get(i));
            }
            return result;
        }
    }
    

    相关文章

      网友评论

          本文标题:2021-02-12 113. 路径总和 II

          本文链接:https://www.haomeiwen.com/subject/ouqjxltx.html