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

力扣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;
    }
}
posted @   卬啵哩啵bo  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示