• [算法刷题笔记]二叉树之左叶子之和



    📃个人主页: 不断前进的皮卡丘
    🌞博客描述: 梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
    🔥网站推荐:千里之行,始于足下。每天坚持刷题,巩固所学知识,也为将来找工作,面试做好准备----- 刷题神器

    前言

    学习算法,还有一些知识的时候,有时候看书后以为自己懂了,结果做题就发现自己没什么思路,为此,博主决定坚持刷题,这里给大家推荐一个适合大家做题复习,准备面试的网站点此进入,里面还有大量的面经,大家可以在面试之前去看看
    在这里插入图片描述
    我们可以看到里面根据不同知识层面分成对应的题库,算法也进行了对应的分类,十分的友好,接下来就开始今天的刷题之旅

    左叶子之和

    题目描述

    题目链接
    计算给定二叉树的左叶子之和。

    树上叶子节点指没有后继节点的节点,左叶子指连向父节点的左侧的叶子节点。
    在这里插入图片描述

    递归

    题目要求的是左叶子之和,所以我们得用一个变量rs来保存这些数值之和
    这题的关键是理解什么是左叶子节点
    在这里插入图片描述
    接下来讲讲递归的思路
    1️⃣判断是否有根节点
    2️⃣判断根节点是否有左孩子(root.left)
    3️⃣判断根节点的左孩子是不是左叶子节点
    4️⃣递归遍历左子树和右子树在这里插入图片描述
    我来说明一下容易犯错的点,因为是要求左叶子之和,所以我们用变量rs来记录这个值。因为rs是需要保留原来的值,然后在此基础上求和的。我们有一个办法就是写成静态变量,但是非静态方法不能用静态变量。所以我们可以把rs写成属性。
    那么我们为什么不可以把rs写在方法体中呢?因为我们这里使用的是递归的方法,递归的话,方法会调用方法本身,每次调用一个方法,都会在内存中开辟一个栈空间,此时的rs是全新的,和原来的rs没有关系,所以rs不能写在方法体中,如果我们用到的是迭代的方法,就可以把rs写在方法体中

    迭代

    迭代的思路和递归是一样的

    class Solution {
      
        public int sumOfLeftLeaves(TreeNode root) {
           if(root==null) return 0;
           int rs=0;
           Queue<TreeNode> queue=new LinkedList();
           queue.offer(root);
           while(!queue.isEmpty()){
               TreeNode node=queue.poll();
               if(node.left!=null && node.left.left==null && node.left.right==null){
                rs+=node.left.val;
               }
               if(node.left!=null){
                   queue.offer(node.left);
               }
               if(node.right!=null){
                   queue.offer(node.right);
               }
           }
           return rs;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    找树的左下角之值

    题目描述

    给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

    在这里插入图片描述
    在这里插入图片描述

    迭代法

    这道题目其实是以用层序遍历的模板来解决的,我们逐层遍历二叉树,用变量curLeftNode来记录当前这一层的最左边的节点

    class Solution {
        public int findBottomLeftValue(TreeNode root) {
            if(root==null) return 0;
            Queue<TreeNode> queue = new LinkedList();
            TreeNode curLeftNode=null;
            queue.offer(root);
            //层序遍历
            //每层的最左端节点,是二叉树目前最左边节点
            while(!queue.isEmpty()){
                int len=queue.size();
                for(int i=0;i<len;i++){
                     TreeNode node=queue.poll();
                     if(i==0){
                         //i=0说明此时这个节点,是当前这个层的第一个节点
                         curLeftNode=node;
                     }
                   
                    if(node.left!=null){
                        queue.offer(node.left);
                    }
                    if(node.right!=null){
                        queue.offer(node.right);
                    }
    
                }
               
               
            }
            return curLeftNode.val;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    结束语

    希望大家可以自己动手练习一下,算法光看是不行的,必须亲自动手敲代码,有时候你会发现自己有思路,但是又写不出来,这就是缺乏练习的原因。大家平时在做题的时候,可以多思考,多总结。
    刚开始的时候,我们可能遇到一种新的题型,完全没有思路的时候,其实可以先去看看别人的思路,还有题解,把它理解下来,然后把代码敲出来(不要复制粘贴,我们根据自己的理解敲出代码这样才有效果,如果中途卡住了,也可以再回过头去看看)
    另外,为了检测一下我们是否真正的掌握,我们可以去做几道相似的题目巩固一下,顺便检验一下自己的成果。
    点此跳转去练习在这里插入图片描述
    这里面有对应的题目,比如链表,二叉树等等,我们可以找到自己想要练习的题目,根据标签就可以进行筛选了,非常的方便。
    算法不是看会的,而是在做题中学会的,这是我的个人看法,刚开始由浅入深,不要太追求效率,先把自己的思路写出来,然后逐渐培养思维,然后在有一定的积累以后,我们再来追求效率,再来追求一题多解。算法贵在坚持,不可能一朝一夕就成为大牛。

    如果有的小伙伴急着找工作的话,如果时间比较紧张,那么,我们可以先把一些面试高频的题目给做了,像这里面就列举出来了面试必刷题目。
    一起坚持下去,冲冲冲在这里插入图片描述

  • 相关阅读:
    2023-9-11 拆分-Nim游戏
    Mysql索引、事务、存储引擎
    行为型模式-迭代器模式
    〈西游记〉中所有插曲、主题曲
    有哪些设计模式,作用是什么?
    Windows + Msys 下编译 TensorFlow 2.14
    java高级编程day23【谷】
    浩哥的博客之路
    抽象工厂模式与工厂方法模式代码结构的区别
    SpringMVC执行流程
  • 原文地址:https://blog.csdn.net/qq_52797170/article/details/126151892