首页 > 其他分享 >代码随想录刷题学习日记

代码随想录刷题学习日记

时间:2024-11-04 20:18:31浏览次数:6  
标签:node count val 路径 随想录 日记 null 节点 刷题

仅为个人记录复盘学习历程,解题思路来自代码随想录

代码随想录刷题笔记总结网址:
代码随想录

递归函数什么时候需要返回值?什么时候不需要返回值?

如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。

如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 

如果要判断是否有符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。

112. 路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

提供参数:根结点root

关键思路:本题需要判断是否有符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。本题采用递归+回溯的方法来探索解空间树,使用先序遍历来遍历整个二叉树,在遍历过程中累计路径上的值,当遇到叶节点时进行判断累计值是否与目标值相等,进而判断本条路径是否满足条件,满足条件则返回,不满足条件继续遍历,直到满足条件或遍历完整棵树。本题在值的累加上使用相反的方法,遍历节点时减去当前节点的值。

主要操作:

递归三要素

1.返回值类型与参数:

本题需要返回值,且判断是否有满足条件的路径,返回值类型为boolean,参数为节点node,目标值count。

2.终止条件:

判断是否为叶子节点,且判断是否减去叶子节点的值后为0,为0返回true,否则为叶子节点返回false。

3.单层递归逻辑:

如果左子节点不为空,count减去当前结点值,继续遍历左子节点,结束后回溯(加回结点值)。

如果右子节点不为空,count减去当前结点值,继续遍历右子节点,结束后回溯(加回结点值)。

代码大致如下:

    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null)return false;
        return traversal(root,targetSum);
    }

    public boolean traversal(TreeNode node,int count){

        //终止条件
        if(node.left==null&&node.right==null&&count-node.val==0)return true;
        if(node.left==null&&node.right==null)return false;
        //单层递归逻辑
        if(node.left!=null){
            count-=node.val;
            if(traversal(node.left,count))return true;
            count+=node.val;
        }
        if(node.right!=null){
            count-=node.val;
            if(traversal(node.right,count))return true;
            count+=node.val;
        }
        return false;
    }

113. 路径总和ii

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

提供参数:根结点root

关键思路:递归遍历+回溯,遍历是不仅仅需要记录累加值还需要记录路径信息,当遇到叶子节点时判断是否满足条件,满足条件将当前路径加入到结果集中,然后回溯,继续遍历,寻找所有满足条件的路径。

主要操作:

递归三要素

1.返回值类型和参数:

本题需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。需要参数节点node,和目标值计算count,需要全局变量res记录结果,path记录路径信息。

2.终止条件:

与上题终止条件类似,判断为叶子节点后,如果当前路径满足条件,则加入结果集,然后返回,如果不满足条件,则直接返回。

3.单层递归逻辑:

如果左子节点不为空,先将当前节点加入路径,减去当前节点值,遍历左子节点,完成后回溯(在路径中删除当前节点,加回当前结点值)。

如果右子节点不为空,先将当前节点加入路径,减去当前节点值,遍历右子节点,完成后回溯(在路径中删除当前节点,加回当前结点值)。

代码大致如下;

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

    public void traversal(TreeNode node,int count){

        //终止条件
        if(node.left==null&&node.right==null&&count-node.val==0){
            path.add(node.val);
            res.add(new ArrayList(path));
            path.remove(path.size()-1);
            return;
        }
        if(node.left==null&&node.right==null)return;

        //单层递归逻辑
        if(node.left!=null){
            path.add(node.val);
            count-=node.val;
            traversal(node.left,count);
            count+=node.val;
            path.remove(path.size()-1);
        }
        if(node.right!=null){
            path.add(node.val);
            count-=node.val;
            traversal(node.right,count);
            count+=node.val;
            path.remove(path.size()-1);
        }

    }

标签:node,count,val,路径,随想录,日记,null,节点,刷题
From: https://blog.csdn.net/weixin_73939095/article/details/143454560

相关文章

  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录654.最大二叉树给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右......
  • 代码随想录第四天|链表part02--24. 两两交换链表中的节点、19.删除链表的倒数第N个节
    资源引用:leetcode题目:24.两两交换链表中的节点(24.两两交换链表中的节点-力扣(LeetCode))19.删除链表的倒数第N个结点(19.删除链表的倒数第N个结点-力扣(LeetCode))面试题02.07.链表相交(面试题02.07.链表相交-力扣(LeetCode))142.环形链表Ⅱ(142.环形链表II-力扣(Leet......
  • 代码随想录第十八天
    530.二叉搜索树的最小绝对差给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。示例1:输入:root=[4,2,6,1,3]输出:1示例2:输入:root=[1,0,48,null,null,12,49]输出:1提示:树中节点的数目范......
  • 代码随想录第十七天
    654.最大二叉树给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的子数组后缀上构建右子树。返回nums构建的*最大......
  • 代码随想录算法训练营第十一天|leetcode150. 逆波兰表达式求值、leetcode239. 滑动窗
    1leetcode150.逆波兰表达式求值题目链接:150.逆波兰表达式求值-力扣(LeetCode)文章链接:代码随想录视频链接:栈的最后表演!|LeetCode:150.逆波兰表达式求值哔哩哔哩bilibili自己的思路:这是一道有思路,但是思路并不多的题目,就是我会觉得是先将数据进行添加,然后对于符号通过......
  • 代码随想录算法训练营第十五天|leetcode110. 平衡二叉树、leetcode257.二叉树的所有路
    1leetcode110.平衡二叉树题目链接:110.平衡二叉树-力扣(LeetCode)文章链接:代码随想录视频链接:后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树_哔哩哔哩_bilibili1.1视频看后的思路1.1.1完整的代码就是不断判断,对其数据存储,其实突然发现每道题思路真的都很像,就......
  • [Python学习日记-60] 什么是面向对象的程序设计
    [Python学习日记-60]什么是面向对象的程序设计简介编程范式面向过程编程面向对象编程简介    前面我们学习了Python中的语法、数据类型、函数之类的一系列相关知识,我们对Python的编程也比较了解了,甚至可以写一些脚本出来进行一些文件的过滤或者日志的生成......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录106.从中序与后序遍历序列构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树,假设树中没有重复的元素。提供参数:中序遍历数组inorder,后序遍历数组postorder主要操作:递归三要素1......
  • 代码随想录一刷——49.字母异位词分组
    在C语言中确实是有哈希表这个结构体的,因而利用哈希表来解决这个问题C:/** *Returnanarrayofarraysofsize*returnSize. *Thesizesofthearraysarereturnedas*returnColumnSizesarray. *Note:Bothreturnedarrayand*columnSizesarraymustbemal......