算法练习-树 LeetCode 113. 路径总和 II

今日心情:🥱🥱 麻了

题目描述:

 LeetCode 113. 路径总和 II

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

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

 


解题代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */

class Solution {

    public static void process(TreeNode x, List<Integer> path, int preSum, int sum, List<List<Integer>> ans){
        //到达最后叶子节点处
        if(x.left == null && x.right == null){
            if(preSum + x.val == sum){
                path.add(x.val); //添加当前节点;
                ans.add(copy(path)); //添加到满足条件的总的大集合中
                path.remove(path.size()-1);
            }
            return;
        }
        //还没有到叶子节点的时候(非叶子节点)
        path.add(x.val);
        preSum += x.val;
        if(x.left != null){
            process(x.left,path,preSum,sum,ans); //左节点递归调用
        }
        if(x.right != null){
            process(x.right,path,preSum,sum,ans); // 右节点递归调用
        }

        path.remove(path.size()-1); 
        // 如果有递归返回的话,说明当前还不满足targetsum值,所以从路径path中删除当前节点的值,进入下一循环。

    }

    // 拷贝符合条件的path
    public static List<Integer> copy(List<Integer> path){
        List<Integer> ans = new ArrayList<>();
        for(Integer num : path){
            ans.add(num);
        }
        return ans;
    }


    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> ans = new ArrayList<>();
        if(root == null){return ans;}
        ArrayList<Integer> path = new ArrayList<>();
        process(root,path,0,targetSum,ans);
        return ans;
    }
}

解题思路:(来自左神 👉 数据结构与算法视频 

(1)和之前写的路径总和那道题很像,只不过这道题就是将所有满足目标sum的路径都找出来并且返回一个list集合(👉 路径求和解析

(2)还是采用递归调用的思想进行解题

(3)首先判断树节点不为空的情况(为空不需要进行递归,直接返回空的List<List<Integer>>通过ArrayList<>()实现。

(4)递归方法 process 参数: 当前treenode 节点 x ,存储当前路径的(List) path, 之前所有节点的值的总和presum,需要达到的目标sum,以及存储所有满足sum条件的path的集合。

        1. 首先判断叶子节点处的情况(结束当前递归调用判断)

            x.left == null && x.right == null (叶子节点左右均无节点)

           如果该节点是叶子节点,那么presum + x.val (之前所有节点值总和 + 当前节点值 )是否满足targetsum 的要求,如果是则说明存在这样的节点 path 满足这样的sum要求,此时path需要添加当前 x.val的值,然后将当前path的所有节点值集合拷贝到ans集合中去。 

        2. 对于非叶子节点的处理

            添加当前节点值到当前path中

            计算presum += x.val (计算presum 直到加到叶子节点为止)

            如果当前节点存在左右节点,则进行递归调用,直到叶子节点的判断为止,最终返回。

             x.left != null ; x.right != null

        3. ⚠️注意: 需要移除path最后一个,恢复递归调用前的节点存储路径。

 (5)在主函数中调用process方法,然后返回存储路径的ans。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值