首页 > 其他分享 >力扣113 路径的总和 返回所有满足条件的路径

力扣113 路径的总和 返回所有满足条件的路径

时间:2023-01-03 21:58:49浏览次数:42  
标签:满足条件 路径 value 力扣 113 ans path 节点

力扣113 路径的总和 返回所有满足条件的路径

题目:

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

叶子节点 是指没有子节点的节点。

示例 1:

img

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

img

输入:root = [1,2,3], targetSum = 5
输出:[]

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

提示:

  • 树中节点总数在范围 [0, 5000]
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

解题思路:

我们要返回所有满足条件的路径我们需要返回一个list里面嵌套一个list,借鉴力扣112的思路 我们只需要再添加一个list ans 每次将满足条件的路径添加到ans中,具体实现代码如下:

代码:

import java.util.ArrayList;
import java.util.List;

/**
 * 路经总和:找出所有从根节点到叶子节点路径总和等于给定目标和的路径
 */
public class PathSum {
    //1.首先定义一个表示二叉树节点类型的类
    public static class TreeNode{
        public int value;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(int value) {
            this.value = value;
        }
    }

    //2.定义一个函数来处理满足条件的路径,这个函数用来递归

    /**
     *
     * @param x  当前来到的节点
     * @param path 之前保留哪些值作为的路径
     * @param preSum 之前保留值作为路径的和
     * @param sum  要满足条件的和sum
     * @param ans  发现一条满足的路径就加入到ans中
     */
    public static void process(TreeNode x, List<Integer> path,int preSum,int sum,List<List<Integer>> ans){
        //2.1如果当前来到的x节点是叶子节点的话就判断该叶子节点前面的路径和preSum加上该叶子节点的值是否等于sum
        if(x.left == null && x.right == null){
            /*
            如果该叶子节点的值加上之前路径上的和等于sum就将该叶子节点上的值加入到path中
            然后再将path的copy加入到ans中
             */
            if(preSum + x.value == sum){
                path.add(x.value);
                ans.add(copy(path));
                /*
                这一步很重要。清理现场 因为在path中已经找到了一条满足条件的路径,我们要返回到叶子点的上一节点继续寻找
                看是否还有满足条件的路径如果不把上一步满足条件的路径的叶子节点删除那么下一次寻找的路径就包含上一次满足
                条件的路径的叶子节点这样路径就不对了,所以在拷贝完路径之后加入到ans中后我们必须要将path中的最后一个节
                点删除掉。
                 */
                path.remove(path.size() - 1);
            }
            return;
        }
        //2.2如果当前来到的x节点是非叶子节点 就先将x节点的value加入到path中 然后再将x节点的value值与之前路径和preSum相加
        path.add(x.value);
        preSum+= x.value;
        //2.3如果当前来到的x节点的左子树不为空就递归的处理x节点的左子树,如果x节点的右子树不为空就递归处理x节点的右子树
        if(x.left != null){
            process(x.left,path,preSum,sum,ans);
        }
        if(x.right != null){
            process(x.right,path,preSum,sum,ans);
        }
        //2.4同样我们需要删除掉path中的最后一个节点
        path.remove(path.size() - 1);
    }

    //3.定义一个函数复制路径
    public static List<Integer> copy(List<Integer> path){
        List<Integer> ans = new ArrayList<>();
        for (Integer num : path){
            ans.add(num);
        }
        return ans;
    }

    //4.主函数:定义一个函数用来返回满足条件的路径
    /*
    我们将一个路径上的所有节点的值都存储在一个list中,而所有的路径我们又存储在一个list中
    所以我们的返回类型是List<List<Integer>>
     */
    public static List<List<Integer>> pathSum(TreeNode root,int sum){
        //4.1定义一个List 用来返回满足条件的路径
        List<List<Integer>> ans = new ArrayList<>();
        //4.2如果根节点为空那么就没有满足条件的路径
        if (root == null) {
            return ans;
        }
        //4.3定义一个list用来存储满足条件路径上的节点的值value
        ArrayList<Integer> path = new ArrayList<>();
        //4.4调用处理函数process
        process(root,path,0,sum,ans);
        //4.5最后返回ans
        return ans;
    }
}

标签:满足条件,路径,value,力扣,113,ans,path,节点
From: https://www.cnblogs.com/ygstudy/p/17020297.html

相关文章

  • matlab启动时的路径警告
    前段时间在做HDLCoder时为方便修改设置加了一条路径在搜索路径目录,后来把路径名称修改了,文件夹也删掉了,换句话说就是路径不存在了,然后在matlab的setpath对话框里边也把该目......
  • 力扣112 路径的总和II
    力扣112路径的总和II题目:给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标......
  • 力扣1
    485 最大连续1的个数给定一个二进制数组 nums ,计算其中最大连续 1 的个数。 示例1:输入:nums=[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三......
  • BM29 二叉树中和为某一值的路径(一)
    题目描述思路分析采用递归的方法,左(右)子树的sum=sum-root.val。每次都减去当前的root值,如果左子树或者右子树的节点值等于sum,则说明找到了,返回true,否则当root为空......
  • 力扣110 判断是否是平衡二叉树
    力扣110判断是否是平衡二叉树题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对......
  • c语言获取当前工作路径的实现代码(windows/linux)
    https://www.php1.cn/detail/c_YuYanHuoQuDang_c0079976.html Linux函数名:getcwd功能:取得当前的工作目录用法:char*getcwd(char*buf,size_tsize);函数......
  • 力扣107 二叉树的层序遍历
    力扣107二叉树的层序遍历题目:给你二叉树的根节点root,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)示例1:输入:root......
  • 力扣239 滑动窗口最大值
    题目:给你一个整数数组nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k 个数字。滑动窗口每次只向右移动一位。返回......
  • 力扣105 根据先序遍历以及中序遍历构建二叉树
    力扣105根据先序遍历以及中序遍历构建二叉树题目:给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树......
  • 力扣104 求二叉树的最大深度
    力扣104求二叉树的最大深度题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示......