zoukankan      html  css  js  c++  java
  • 【二叉树-所有路经系列(根->叶子)】二叉树的所有路径、路径总和 II、路径总和、求根到叶子节点数字之和(DFS)

    总述

    • 全部用DFS来做
    • 重点一:参数的设置:为Root,路径字符串,路径List集合。
    • 重点二:步骤:
      • 1 节点为null
      • 2 所有节点的操作
      • 3 叶子结点的操作
      • 4 非叶节点的操作

    题目257. 二叉树的所有路径

    给定一个二叉树,返回所有从根节点到叶子节点的路径。
    例:输出: ["1->2->5", "1->3"]

    代码

    class Solution {
        public List<String> binaryTreePaths(TreeNode root) {
            List<String> list = new LinkedList<>();
            String s = "";
            getPaths(root,s,list);
            return list;
        }
    
        public void getPaths(TreeNode root,String path,List<String> ans){
            //1 节点不为null
            if(root!=null){
                // 2 所有节点的操作
                path+=root.val;
                // 3 叶子节点的操作
                if(root.left==null&&root.right==null){
                    ans.add(path);
                }
                else{
                    //4 非叶节点的操作
                    path+="->";
                    getPaths(root.left,path,ans);
                    getPaths(root.right,path,ans);
                }
            }
        }
    }
    

    题目113. 路径总和 II

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

    题解

    • 步骤同上
    • 此外,注意由于参数path全局只有一份,所以当放入pathList集合时要拷贝再放入。
    • 此外,注意当叶子结点或非叶节点处理完,要path.removeLast()恢复现场。

    代码

    class Solution {
        public List<List<Integer>> pathSum(TreeNode root, int sum) {
            List<List<Integer>> pathList = new LinkedList<>();
            LinkedList<Integer> list = new LinkedList<>();
            getPaths(root,sum,list,pathList);
            return pathList;
        }
    
        public void getPaths(TreeNode root,int sum,LinkedList<Integer> path,List<List<Integer>> pathList){
            //1 节点为null
            if(root==null){return;}
    
            //2 所有节点的操作
            sum-=root.val;
            path.add(root.val);
    
            //3 叶子节点的操作
            if(root.left==null&&root.right==null){
                if(sum==0){pathList.add(new LinkedList<Integer>(path));}//一定要new
                path.removeLast();
            }else{
                //4 非叶节点的操作
                getPaths(root.left,sum,path,pathList);
                getPaths(root.right,sum,path,pathList);
                path.removeLast();
            }
        } 
    }
    

    题目112. 路径总和

    给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

    题解

    • 步骤同上
    • 特别地,回溯方法有返回值,返回值为是否有满足题意的路径。

    代码

    class Solution {
        public boolean hasPathSum(TreeNode root, int sum) {
            //1 节点为null
            if(root==null){
                return false;
            }
    
            //2 所有节点的操作
            sum -=root.val;
            //3  叶子节点的操作
            if(root.left==null&&root.right==null){
                return sum==0;
            }
            //4 非叶节点的操作
            return (hasPathSum(root.left,sum)||hasPathSum(root.right,sum));
        }
    }
    

    题目 129. 求根到叶子节点数字之和

    代码

    class Solution {
        private int sum;
    
        public int sumNumbers(TreeNode root) {
            dfs(root,0);
            return sum;
        }
    
        private void dfs(TreeNode root,int pathSum){
            if(root ==null){
                return ;
            }
            pathSum=pathSum*10+root.val;
            if(root.left==null&&root.right==null){
                sum+=pathSum;
            }
            dfs(root.left,pathSum);
            dfs(root.right,pathSum);
        }
    }
    
  • 相关阅读:
    JDK1.0-缓冲流
    笔试错误1
    JVM 垃圾收集(转)
    Trie树和后缀树(转,简化)
    海量数据处理(转,简化)
    Struts2 内核之我见(转) -(主要是拦截器链和过滤链介绍和源码及其设计模式)
    phpize增加php模块
    Ubuntu下SVN安装和配置
    Linux下SVN配置hook经验总结
    Kruakal 算法——练习总结
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/13040965.html
Copyright © 2011-2022 走看看