【寸铁的刷题笔记】树、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;//把每次计算的结果取一个maxmaxSum = 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;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单的单层感知机(Perceptron)模型

[‘您需要实现一个简单的单层感知机&#xff08;Perceptron&#xff09;模型&#xff0c;并提供对其训练方法的实现。单层感知机是一种基础的线性二分类器&#xff0c;它对输入向量进行权值组合&#xff0c;然后通过激活函数&#xff08;通常是一个符号函数&#xff09;来决定该…

[附完整代码]群智能算法跑21种真实世界优化问题,并输出结果到excel||群智能算法跑CEC 2020真实世界优化问题,并输出结果到excel

1、简介 灰狼算法跑跑21种真实世界优化问题|足球训练队优化算法跑21种真实世界优化问题||牛顿拉夫逊算法跑21种真实世界优化问题||冠状豪猪CPO跑21种真实世界优化问题。 ‘FTTA’,‘BWO’, ‘CPO’, ‘FHO’, ‘GWO’, ‘HHO’, ‘NRBO’,‘SCA’,‘SGA’,WOA’跑21种真实世…

拓扑矩阵是四维协变量吗?

* 现在需要明确&#xff0c;拓扑矩阵的维度高于链表数据&#xff0c;那么用矩阵就可以控制链表数据&#xff0c;用矩阵表来 * 做循环&#xff0c;四维循环相当于三维向量的矢量运动嘛&#xff1f;我们在矩阵上面做计算也可以启动链表的运 * 动控制模型。。 * * 四维算法中应…

Linux:ACL权限,特殊位和隐藏属性

目录 一.什么是ACL 二.操作步骤 ① 添加测试目录、用户、组&#xff0c;并将用户添加到组 ② 修改目录的所有者和所属组 ③ 设定权限 ④ 为临时用户分配权限 ⑤ 验证acl权限 ⑥ 控制组的acl权限 三. 删除ACL权限 一.什么是ACL 访问控制列表 (Access Control List):ACL 通…

笔记本Win 10系统查看电池健康状况

博主最近换了个笔记本电池&#xff0c;之前的电池容量明显变小了很多&#xff0c;而且出现了轻微鼓包的情况。所以用gpt问了一下怎么用系统的方法查看电池情况。 在Windows 10系统中&#xff0c;您可以通过以下步骤来查看笔记本电脑电池的健康状况&#xff1a; 打开命令提示符&…

docker 带端口映射启动是报错

一、现象 docker端口映射或启动容器时报错 Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 二 、原因: docker服务启动时定义的自定义链DOCKER由于 centos7 firewall 被清掉 firewall的底层是使用iptables进行数据…

react + typescript 中 typeof的作用

在 TypeScript 中&#xff0c;使用 typeof 关键字可以获取一个变量或对象的类型。当你用 typeof 和一个组件&#xff08;无论是类组件还是函数组件&#xff09;一起使用时&#xff0c;你实际上是在获取这个组件的类型。 在 React 中&#xff0c;组件的类型不仅仅包括它的 prop…

CondaValueError: Malformed version string ‘~‘: invalid character(s)

使用conda 安装一些库时出现以下报错&#xff1a; CondaValueError: Malformed version string ~: invalid character(s)尝试进行更新conda conda upgrade -n base conda或者如果是环境方面的问题&#xff0c; conda upgrade -n base -c defaults --override-channels conda如…

记录 使用FFMPEG 笔记本摄像头推流

一、使用 FFMPEG 测试摄像头拉流显示 # 获取摄像头名称 ffmpeg -list_devices true -f dshow -i dummy# 我笔记本上的摄像头名称如下 device_pnp_\\?\usb#vid_0408&pid_1020&mi_00#6&199e90f7&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global# 使…

重温MySQL

mysql 是什么 mysql 就是一个软件,专门用来管理文件的软件 关系型数据库:采用二维表结构组织和管理数据,并且规定了表和表间数据的关系. 表是由行和列构成,列包含一组命名的属性(也称字段),行包含一条记录.行和列的交集称为数据项 (也称字段值). 如何操作数据库 那就是用sq…

Vue2页面转化为Vue3

vue2element-ui转化为Vue3element plus 后台管理系统&#xff1a;增删查改 vue2页面&#xff1a; <template><div class"app-container"><div><el-form:model"queryParams"ref"queryForm"size"small":inline&qu…

golang tun设备创建并监听

golang tun设备创建并监听 linux tun设备文件地址为/dev/net/tun.直接打开即可(关闭文件描述符创建的tun虚拟接口自动注销) fd,err:syscall.Open("/dev/net/tun",syscall.O_RDWR,0640)//关闭 syscall.Close(fd)初始化 配置ip地址启动虚拟网卡 ip addr add xxx.xx…

命令绕过 [安洵杯 2019]easy_web1

打开题目 打开题目在URL处看到cmd&#xff0c;本能的直接用系统命令ls 发现被过滤了。又注意到imgTXpVek5UTTFNbVUzTURabE5qYz0似乎是一串base64 拿去base64解码 再hex解码一次得到555.png 再将其hex加密 base64加密 反向推出index.php的payload:?imgTmprMlJUWTBOalUzT0RK…

HTML和CSS是前端开发中最基础的两个技术[入门级]

HTML和CSS是前端开发中最基础的两个技术 下面是它们的代码结构&#xff1a;HTML代码结构&#xff1a; html <!DOCTYPE html> <html> <head> <title>Page Title</title> <meta charset"UTF-8"> <…

基于Redis限流(固定窗口、滑动窗口、漏桶、令牌桶)(肝货!!!)

近期redis复习的比较多&#xff0c;在限流这方面发现好像之前理解的限流算法有问题&#xff0c;索性花了一天“带薪摸鱼”时间肝了一天&#xff0c;有问题可以评论区探讨。 废话不多说&#xff0c;正片开始 目录 Maven固定窗口滑动窗口算法漏桶算法令牌桶算法 Maven 有些不用的…

SQL语句创建数据库全解析

SQL语句创建数据库全解析 大家好&#xff01;在今天的博客中&#xff0c;我们将详细讨论如何使用SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;语句来创建一个数据库。SQL是用于管理&#xff08;如检索&#xff0c;定义&#xff0c;操纵&a…

快速排序法的名字由来,排序步骤是什么,最坏情况下的排序次数如何计算得来的呢?

问题描述&#xff1a; 快速排序法的名字由来&#xff0c;排序步骤是什么&#xff0c;最坏情况下的排序次数如何计算得来的呢&#xff1f; 问题解答&#xff1a; 快速排序法的名字来源于其排序速度快的特点。它是由英国计算机科学家 Tony Hoare 于1960年提出的&#xff0c;最…

板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第六节 HttpSession对象全解 一、什么是HttpSessionSession的本质 二、创建Seesion及常用方法三、Session域对象四、Session对象的销毁 在上一节中&#xff0c;我们学习了Servlet五大对象里的第三个Cookie对象&#xff0c;但Cookie是有大小限制和…

Linux操作体系结构与功能流程

文章目录 前言一、linux操作系统结构二、操作系统的工作方式三、操作系统内核中各级模块的相互关联四、Linux操作系统结构的独立性 前言 以内核代码 v0.11 和 v3.4.2 版本源码对 Linux 内核相关知识进行学习&#xff0c;由浅入深逐步掌握 Linux 内核。本文记录 Linux 操作系统…

了解您的数据库管理系统及其优化器

PostgreSQL 模式 物品具有唯一标识符、唯一图像标识符、名称和价格。 仓库具有唯一标识符、名称以及由街道、城市和国家定义的位置。 对于每个可用的物品&#xff0c;我们记录每个仓库中的库存数量。如果某个物品在仓库中不可用&#xff0c;则这对没有记录。数量总是等于或大于…