【二叉树-所有路经系列(根->叶子)】二叉树的所有路径、路径总和 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);
    }
}
原文地址:https://www.cnblogs.com/coding-gaga/p/13040965.html