zoukankan      html  css  js  c++  java
  • Leetcode 113 路径总和 II

    题目定义:

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

    方式一(回溯):

    class Solution {
        private List<List<Integer>> ans = new ArrayList<>();
        public List<List<Integer>> pathSum(TreeNode root, int sum) {
            if(root == null)
                return ans;
            dfs(new ArrayList<>(),root,sum);
            return ans;
        }
        private void dfs(List<Integer> list,TreeNode root,int remaining){
            if(root == null)
                return;
            list.add(root.val);
            if(root.left == null && root.right == null && remaining - root.val == 0){
                List<Integer> dest = new ArrayList<>();
                Collections.addAll(dest, new Integer[list.size()]);
                Collections.copy(dest,list);
                ans.add(dest);
                return;
            }
            dfs(list,root.left,remaining - root.val);
            dfs(list,root.right,remaining - root.val);
            list.remove(list.size() - 1);
        }
    }
    

    方式二(深度优先遍历):

    class Solution {
        List<List<Integer>> ans = new LinkedList<>();
        Deque<Integer> stack = new LinkedList<>();
        public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
            dfs(root,targetSum);
            return ans;
        }
        private void dfs(TreeNode root,int targetSum){
            if(root == null)
                return;
            stack.offerLast(root.val);
            targetSum -= root.val;
            if(root.left == null && root.right == null && targetSum == 0){
                ans.add(new LinkedList<>(stack));
            }
            dfs(root.left,targetSum);
            dfs(root.right,targetSum);
            stack.pollLast();
        }
    }
    

    方式三(广度优先遍历):

    class Solution {
        List<List<Integer>> ans = new ArrayList<>();
        Map<TreeNode,TreeNode> cache = new HashMap<>();
        public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
            if(root == null)
                return ans;
            
            Queue<TreeNode> queueNode = new ArrayDeque<>();
            Queue<Integer> queueParentSum = new ArrayDeque<>();
            queueNode.offer(root);
            queueParentSum.offer(0);
            while(!queueNode.isEmpty()){
                TreeNode node = queueNode.poll();
                int ret = node.val + queueParentSum.poll();
                if(node.left == null && node.right == null){
                    if(ret  == targetSum){
                        getPath(node);
                    }
                }else{
                    if(node.left != null){
                        cache.put(node.left,node);
                        queueNode.offer(node.left);
                        queueParentSum.offer(ret);
                    }
                    if(node.right != null){
                        cache.put(node.right,node);
                        queueNode.offer(node.right);
                        queueParentSum.offer(ret);
                    }
                }
            }
            return ans;
        }
    
        private void getPath(TreeNode node){
            List<Integer> temp = new ArrayList<>();
            while(node != null){
                temp.add(node.val);
                node = cache.get(node);
            }
            Collections.reverse(temp);
            ans.add(temp);
        }
    }
    

    参考:

    https://leetcode-cn.com/problems/path-sum-ii/solution/lu-jing-zong-he-ii-by-leetcode-solution/

  • 相关阅读:
    Codeforces Round #545 (div 1.)
    THUSC 2017 大魔法师
    loj #6216. 雪花挂饰
    [NOI Online #2 提高组]涂色游戏
    [NOI Online #2 提高组]子序列问题
    [NOI Online #1 入门组]跑步
    备战noip week7
    [NOI Online #3 提高组]优秀子序列
    20201017校测
    springboot基于maven多模块项目搭建(直接启动webApplication)
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/14280619.html
Copyright © 2011-2022 走看看