【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(二)

【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(二)

大家好 我是寸铁👊
金三银四,树、dfs、bfs、回溯、递归是必考的知识点✨
快跟着寸铁刷起来!面试顺利上岸👋
喜欢的小伙伴可以点点关注 💝


上期回顾

感谢大家的支持🌹🌹🌹
上期刷题笔记成功入选专栏第8名🔆

【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(一)🎯

在这里插入图片描述

在这里插入图片描述

话不多说,开始新的篇章,继续刷起来💪


124. 二叉树中的最大路径和

思路

要求:返回其最大路径和
做法:路径和:枚举每个点作为起点,加上左右子树的值,取最大值即可。
先递归处理根节点的左右分支,向下走到底,把叶子节点的最大路径和取一个最大值。
回溯:向上回溯时,会计算上层根节点的路径和,继续取一个最大值。
返回:由于每个节点只能选一条路走,最大路径和下应该选择左右分支的最大值分支

代码

/**
 * 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 {
    int maxSum = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        //递归函数入口
        maxGain(root);
        //返回最大路径和
        return maxSum;
    }
    //题意分析:
    /*
    要求:返回其最大路径和
    做法:路径和:枚举每个点作为起点,加上左右子树的值,取最大值即可。
    先递归处理根节点的左右分支,向下走到底,把叶子节点的最大路径和取一个最大值。
    回溯:向上回溯时,会计算上层根节点的路径和,继续取一个最大值。
    返回:由于每个节点只能选一条路走,最大路径和下应该选择左右分支的最大值分支
    */
    public int maxGain(TreeNode node){
        if(node == null){
            return 0;
        }
        //向左递归,计算左子树的叶子节点的最大路径和
        //如果小于0 则不选该分支 因为选了后路径和反而更小
        int leftGain = Math.max(maxGain(node.left) , 0);
        //向右递归,计算右子树的叶子节点的最大路径和
       //如果小于0 则不选该分支 因为选了后路径和反而更小
        int rightGain = Math.max(maxGain(node.right) , 0);
        //计算
        //回溯时,会依次把上层非叶子节点做为根节点,计算其路径和
        int priceNewPath = node.val + leftGain + rightGain;
        //把每次计算的结果取一个max
        maxSum = Math.max(maxSum , priceNewPath);
        //返回一条较大路径 给上层节点继续计算路径和
        return node.val + Math.max(leftGain , rightGain);
    }
}

236. 二叉树的最近公共祖先

思路

核心思想:
不断向上层返回递归左、右子树的结果
再根据结果是否存在p、q 确定返回的最近公共祖先

模拟分析图

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

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //核心思想:
    //不断向上层返回递归左、右子树的结果
    //再根据结果是否存在p、q 确定返回的最近公共祖先
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //如果说根节点为空 则向上返回null即可
        if(root == null)return null;
        //这里是针对两种情况
        //一种是递归遍历时,遍历到的节点为p或者q则向上返回root
        //一种是p为当前的根节点,q为p所在树的后面节点出现,则直接向上返回root即可
        if(root == p || root == q)return root;
        //左、右、中
        //后序遍历 根据递归搜索到的左、右子树节点的情况进行判断
        //递归左子树
        TreeNode left = lowestCommonAncestor(root.left , p , q);
        //递归右子树 
        TreeNode right = lowestCommonAncestor(root.right , p , q);

        //中的逻辑
        //如果说左子树和右子树不为空
        //则当前的root就是最近公共祖先
        //向上返回即可
        if(left != null && right != null){
            return root;
        }else if(left != null && right == null){
            //说明 左子树为最近公共祖先 向上返回
            return left;
        }else if(left == null && right != null){
            //说明 右子树为最近公共祖先 向上返回
            return right;
        }else{
            return null;
        }
    }
}


102. 二叉树的层序遍历

考点

层序遍历、BFS

思路

思路:借助队列实现层序遍历,维护一个节点队列,记录队列的长度。
每次只弹出这一层的节点,把弹出节点添加到结果队列中。
再把弹出节点的左孩子、右孩子添加到节点队列中。
用于下一次节点队列节点的遍历与弹出。

代码


class Solution {
    /*
    思路:借助队列实现层序遍历,维护一个节点队列,记录队列的长度。
    每次只弹出这一层的节点,把弹出节点添加到结果队列中。
    再把弹出节点的左孩子、右孩子添加到节点队列中。
    用于下一次节点队列节点的遍历与弹出。
    */
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root != null){
            Queue<TreeNode>queue = new LinkedList<>();
            queue.offer(root);
            int size;
            TreeNode node;
            while(!queue.isEmpty()){
                List<Integer>ans = new ArrayList<>();
                size = queue.size();
                while(size-- > 0){
                    node = queue.poll();
                    ans.add(node.val);
                    if(node.left != null)queue.offer(node.left);
                    if(node.right != null)queue.offer(node.right);
                }
                res.add(ans);
            }
        }
        return res;
    }
}

199. 二叉树的右视图

考点

层序遍历、BFS

思路

遍历每一层节点时,把他加入节点队列。获取当前队列的长度,弹出节点时,将其左右子孩子都加入队列中,用于下一轮队列的弹出,弹出最后一个节点时,直接将该节点的值添加到结果队列。

代码


class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        //创建一个队列用于存储二叉树右视图节点的值
        List<Integer> res = new ArrayList<>();
        if(root != null){
            //创建队列,用于层序遍历(bfs),存入每一行的点
            Queue<TreeNode>queue = new LinkedList<>();
            //先把根节点添加到队列中
            queue.offer(root);
            //队列的大小,放到外面,减少内存开销。
            int size;
            //存储从队列弹出来的节点,用于把弹出节点的值写入res队列中。
            TreeNode node;
            while(!queue.isEmpty()){
                size = queue.size();
                while(size -- > 0){
                    node = queue.poll();
                //不知道右视图看到的节点情况
                //索性每次弹出节点时,把节点的左孩子和右孩子都添加到队列中。
                    if(node.left != null)queue.offer(node.left);
                    if(node.right != null)queue.offer(node.right);

                //由于是从左到右遍历,入队,最后一个节点为最右侧节点
                //弹出最后一个节点时,把节点的值添加到res中。
                //注意这里是size-- 当size为1时,即为最后一个节点,--后为0。
                    if(size == 0)res.add(node.val);
                }
            }
        }
        return res;
    }
}

637. 二叉树的层平均值

考点

层序遍历、BFS

思路

思路:遍历每一层的节点,将其子孩子添加到队列,获取队列长度。
用临时变量计算每一层的节点的和值,再除以队列长度,最后添加到结果队列中即可。

代码


class Solution {
    /*
    思路:遍历每一层的节点,将其子孩子添加到队列,获取队列长度。
    用临时变量计算每一层的节点的和值,再除以队列长度,最后添加到结果队列中即可。
    */
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double>res = new ArrayList<>();
        if(root != null){
            Queue<TreeNode>queue = new LinkedList<>();
            queue.offer(root);
            int size;
            TreeNode node;
            while(!queue.isEmpty()){
                double sum = 0;
                size = queue.size();
              for(int i = 0; i < size; i++){
                   node = queue.poll();
                   sum += node.val; 
                   if(node.left != null)queue.offer(node.left);
                   if(node.right != null)queue.offer(node.right);
                }
                res.add(sum / size);
            }                
            }
        return res;
    }
}

103. 二叉树的锯齿形层序遍历

考点

层序遍历、双端队列、BFS

思路

根据结果队列的层数,如果说层数是偶数(层数从0开始),则进行从左到右遍历,即头插。如果说层数是奇数(层数从0开始),则进行从右到左遍历,即尾插

代码

/**
 * 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 List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        Queue<TreeNode>queue = new LinkedList<>(); //维护一个队列,存储节点
        List<List<Integer>>res = new ArrayList<>();//存储最后的结果
        if(root != null){
            queue.offer(root);
            int size;
            TreeNode node;
            while(!queue.isEmpty()){//只有队列不为空的时候,再进行弹出队列的节点操作。
                size = queue.size();//更新当前的队列size,确定弹出当前多少个节点用于下一轮的更新。
                List<Integer>ans = new LinkedList<>();//存储这一层的节点
                while(size -- > 0){
                    node = queue.poll();//弹出节点
                    //如果说层数(从0开始)为偶数,则进行尾插,即从左到右
                    if(res.size() % 2 == 0)ans.addLast(node.val);
                    //否则,进行头插,则是从右到左
                    else ans.addFirst(node.val);
                    //把弹出节点的左、右孩子入队
                    if(node.left != null)queue.offer(node.left);
                    if(node.right != null)queue.offer(node.right);
            }
            res.add(ans);//添加ans到最后的结果队列res中
            }
        }
        return res;
    }
}

看到这里的小伙伴,恭喜你又掌握了一个技能👊
希望大家能取得胜利,坚持就是胜利💪
我是寸铁!我们下期再见💕

往期好文💕

保姆级教程

【保姆级教程】Windows11下go-zero的etcd安装与初步使用

【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero

【Go-Zero】手把手带你在goland中创建api文件并设置高亮


报错解决

【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项

【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案

【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案

【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案

【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案

【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案


Go面试向

【Go面试向】defer与time.sleep初探

【Go面试向】defer与return的执行顺序初探

【Go面试向】Go程序的执行顺序

【Go面试向】rune和byte类型的认识与使用

【Go面试向】实现map稳定的有序遍历的方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/406434.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab/simulink基于vsg的风光储调频系统建模仿真(持续更新)

​ 1.Matlab/simulink基于vsg的风光储调频系统建模仿真&#xff08;持续更新&#xff09;

LeetCode 2583.二叉树中的第 K 大层和:层序遍历 + 排序

【LetMeFly】2583.二叉树中的第 K 大层和&#xff1a;层序遍历 排序 力扣题目链接&#xff1a;https://leetcode.cn/problems/kth-largest-sum-in-a-binary-tree/ 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k …

sql注入 [极客大挑战 2019]FinalSQL1

打开题目 点击1到5号的结果 1号 2号 3号 4号 5号 这里直接令传入的id6 传入id1^1^1 逻辑符号|会被检测到&#xff0c;而&感觉成了注释符&#xff0c;&之后的内容都被替换掉了。 传入id1|1 直接盲注比较慢&#xff0c;还需要利用二分法来编写脚本 这里利用到大佬的脚…

学习使用在mysql中查询指定字段字符串包含多个字符串的方法

学习使用在mysql中查询指定字段字符串包含多个字符串的方法 使用LIKE关键字使用REGEXP关键字使用FIND_IN_SET函数使用INSTR函数和AND关键字 使用LIKE关键字 SELECT * FROM table_name WHERE column_name LIKE %string1% AND column_name LIKE %string2%;使用LIKE关键字&#x…

Python爬虫技术详解:从基础到高级应用,实战与应对反爬虫策略【第93篇—Python爬虫】

前言 随着互联网的快速发展&#xff0c;网络上的信息爆炸式增长&#xff0c;而爬虫技术成为了获取和处理大量数据的重要手段之一。在Python中&#xff0c;requests模块是一个强大而灵活的工具&#xff0c;用于发送HTTP请求&#xff0c;获取网页内容。本文将介绍requests模块的…

深入探究node搭建socket服务器

自从上篇中sokect实现了视频通话&#xff0c;但是是使用ws依赖库实现的服务端&#xff0c;所以最近再看ws源码&#xff0c;不看不知道&#xff0c;一看很惊讶。 接下来一点点记录一下&#xff0c;如何搭建一个简易的服务端socket&#xff0c;来实现上次的视频通讯。 搭建一个…

检索增强生成(RAG)——提示工程方法

在检索增强生成(RAG)过程中,提示工程也是一个不可忽略的部分。提示工程可以降低 RAG 应用出现的幻觉,提高 RAG 应用回答的质量。 下面简单介绍一些关于提示工程的论文。 欢迎关注公众号(NLP Research),及时查看最新内容 1. Thread of Thought(ThoT) 论文:Thread of …

LLM (Large language model)的指标参数

1. 背景介绍 我们训练大模型的时候&#xff0c;或者我们用RAG的时候&#xff0c;不知道我们的算法&#xff0c;或者我们的提示&#xff0c;或者我们的本地知识库是否已经整理得符合要求了。又或我们需要一个指标去评估我们目前的所有围绕大模型&#xff0c;向量数据库或外挂知…

【EI会议征稿通知】2024年软件自动化与程序分析国际学术会议(SAPA 2024)

2024年软件自动化与程序分析国际学术会议&#xff08;SAPA 2024) 2024 International Conference on Software Automation and Program Analysis 在当今科技社会中&#xff0c;软件产业呈快速发展趋势&#xff0c;软件自动化与程序分析技术在提高软件质量、降低开发成本、提升…

QT问题 打开Qt Creator发现没有菜单栏

之前不知道按了什么快捷键,当我再次打开Qt Creator时发现菜单栏消失啦 找了许多原因发现:安装有道词典的快捷键Ctrl Alt m 与Qt Creator里的快捷键冲突导致菜单栏被莫名其妙的隐藏 解决方法: 1找到有道词典快捷键 2再次按快捷键 Ctrl Alt m就可以重新显示菜单栏

Servlet使用Cookie和Session

一、会话技术 当用户访问web应用时&#xff0c;在许多情况下&#xff0c;web服务器必须能够跟踪用户的状态。比如许多用户在购物网站上购物&#xff0c;Web服务器为每个用户配置了虚拟的购物车。当某个用户请求将一件商品放入购物车时&#xff0c;web服务器必须根据发出请求的…

特保罗环保节能邀您参观2024生物发酵产品与技术装备展

参观企业介绍 山东特保罗环保节能科技有限公司位处山东章丘区&#xff0c;是一家致力于研发 “MVR&多效蒸发器”和“高难工业废水零排放”技术等的科技制造型高新技术企业。特保罗公司隶属山东明天机械集团股份有限公司&#xff0c;集团公司旗下拥有山东明天机械有限公司、…

计算机网络:思科实验【1-访问WEB服务器】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学&#xff0c;回复思科获取下载链接。 实验目的实验环境实验内容熟悉仿真软件访问WEB服务器 实验体会总结…

CLion 2023:专注于C和C++编程的智能IDE mac/win版

JetBrains CLion 2023是一款专为C和C开发者设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它集成了许多先进的功能&#xff0c;旨在提高开发效率和生产力。 CLion 2023软件获取 CLion 2023的智能代码编辑器提供了丰富的代码补全和提示功能&#xff0c;使您能够更…

32单片机基础:EXTI外部中断

本节是STM32的外部中断系统和外部中断。 中断系统是管理和执行中断的逻辑结构&#xff0c;外部中断是总多能产生中断的外设之一&#xff0c; 所以本节借助外部中断学习一下中断系统。 下图灰色的&#xff0c;是内核的中断&#xff0c;比如第一个&#xff0c;当产生复位事件时…

旷视low-level系列(三):(NAFNet)Simple Baselines for Image Restoration

题目&#xff1a;Simple Baselines for Image Restoration 单位&#xff1a;旷视 收录&#xff1a;ECCV2022 论文&#xff1a;https://arxiv.org/abs/2204.04676 代码&#xff1a;https://github.com/megvii-research/NAFNet 文章目录 1. Motivation2. Contributions3. Methods…

NFT Insider #120:福布斯在 The Sandbox 推出永久建筑,哈佛教授表示Web3 和 NFT 将会继续存在

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

《初阶数据结构》尾声

目录 前言&#xff1a; 《快速排序&#xff08;非递归&#xff09;》: 《归并排序》&#xff1a; 《归并排序&#xff08;非递归&#xff09;》&#xff1a; 《计数排序》&#xff1a; 对于快速排序的优化&#xff1a; 分析&#xff1a; 总结&#xff1a; 前言&#xff1a…

《UE5_C++多人TPS完整教程》学习笔记24 ——《P25 完善菜单子系统(Polishing The Menu Subsystem)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P25 完善菜单子系统&#xff08;Polishing The Menu Subsystem&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&…

200万上下文窗口创飞Gemini 1.5!微软来砸谷歌场子了

谷歌刚刷新大模型上下文窗口长度记录&#xff0c;发布支持100万token的Gemini 1.5&#xff0c;微软就来砸场子了。 推出大模型上下文窗口拉长新方法——LongRoPE&#xff0c;一口气将上下文拉至2048k token&#xff0c;也就是200多万&#xff01; 并且1000步微调内&#xff0c…