代码随想录-56-113. 路径总和 II

前言

在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接

题目

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和targetSum 。如果存在,返回 true ;否则,返回 false 。

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

在这里插入图片描述

在这里插入图片描述

1.递归+回溯(考虑有无返回值)

此题可以使用递归遍历(前序),此题中因为需要遍历整个树(题目说了“找出所有从根节点到叶子节点路径”),所以递归不需要有返回值。判断条件可以是,当到叶子节点时,若此时叶子节点的val等于此时的targetSum。(相当于递归时,传入的targetSum都是用targetSum-当前节点的父节点的val值)

变量

需要设置两个类变量(对于这个类中所有的函数来说是全局变量)。

List<List<Integer>> result 和 List<Integer> list

2. 本题思路分析:

此题可以使用递归遍历,
三部曲:

  • 第一步确定参数和返回值
    参数:当前遍历的树节点,当前的总和targetSum
    返回值:空
  • 第二步截止递归的条件
    当前为叶子节点,如果此时targetSum等于叶子节点的val说明就是找到满足的路径了,将list记录到result中,如果为叶子节点,但是不满足targetSum等于叶子节点的val该路径不为符合条件的路径,退出当前递归(直接return;)。
  • 第三步单层递归逻辑
    如果当前不为叶子节点,则先判断是否有左孩子节点,若有则先将当前root.val加入到list中,并递归左孩子节点,并且此时传入的targetSum是减去当前节点的值(左孩子的父节点)(这里包含回溯思想,这个减法不要赋值给targetSum,而是把减法的值传输到下一层循环中);之后再判断是否右孩子节点,若有则若有则先将当前root.val加入到list中,递归右孩子节点,并且此时传入的targetSum是减去当前节点的值(右孩子的父节点)(这里包含回溯思想,这个减法不要赋值给targetSum,而是把减法的值传输到下一层循环中);

3. 算法实现

List<List<Integer>> result = new ArrayList<>();
List<Integer> list = new ArrayList();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
    if(root == null){
        return result;
    }
    list.add(root.val);
    traversal(root,targetSum);
    return result;
}

public void traversal(TreeNode root, int targetSum) {
    if(root.left == null && root.right == null && targetSum == root.val){
        List<Integer> cur = new ArrayList(list);
        result.add(cur);
        return;
    }
    if(root.left == null && root.right == null){
        return;
    }
    if(root.left != null){
        list.add(root.left.val);
        traversal(root.left,targetSum - root.val);
        list.remove(list.size() - 1);
    }
    if(root.right != null){
        list.add(root.right.val);
        traversal(root.right,targetSum - root.val);
        list.remove(list.size() - 1);
    }
}

4. 算法复杂度

暂无

5. 算法坑点

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值