【寸铁的刷题笔记】树、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.hqwc.cn/news/488117.html

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

相关文章

Vue3 (unplugin-auto-import自动导入的使用)

安装 参考链接 npm i -D unplugin-auto-importvite.config.ts里面配置 import AutoImport from unplugin-auto-import/viteAutoImport({imports:[ vue,vue-router]})重新运行项目会生成一个auto-imports.d.ts的文件 /* eslint-disable */ /* prettier-ignore */ // ts-nochec…

C# If与Switch的区别

在 switch 语句中使用表达式比较时&#xff0c;编译器会生成一个查找表&#xff0c;其中包含所有表达式的值和对应的 case 标签。因此&#xff0c;与使用常量或字面量比较相比&#xff0c;使用表达式比较可能会略微降低性能。 只有当 switch 语句中的所有 case 标签都使用常量或…

亿道丨三防平板丨加固平板丨为零售业提供四大优势

随着全球经济的快速发展&#xff0c;作为传统行业的零售业也迎来了绝佳的发展机遇&#xff0c;在互联网智能化的大环境下&#xff0c;越来越多的零售企业选择三防平板电脑作为工作中的电子设备。作为一种耐用的移动选项&#xff0c;三防平板带来的不仅仅是坚固的外壳。坚固耐用…

记录 使用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# 使…

Typora+PicGo+super-prefix+阿里云OSS设置图床

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;实用工具 1 TyporaPicGosuper-prefix阿里云OSS设置图床1.1 设置阿里云OSS1.2 以时间戳命名图片1.2.1 安装super-prefix1.2.2 设置配置文件 1.3 批量上传图片遇到的问题1.4 参考资料 2 将ma…

【openGL教程 11 】关于坐标系统

目录 一、说明 二、坐标系统 2.1 概述 2.2 局部空间 2.3 世界空间 2.4 观察空间 2.5 裁剪空间 2.6 正射投影 2.7 透视投影 2.8 把它们都组合到一起 三、进入3D 四、更多的3D 4.1 立方体画法 4.2 Z缓冲区 4.3 更多的立方体 五、练习 一、说明 本篇是openGL学习中…

【Java程序设计】【C00284】基于Springboot的校园疫情防控管理系统(有论文)

基于Springboot的校园疫情防控管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园疫情防控系统 本系统分为系统功能模块、管理员功能模块以及学生功能模块。 系统功能模块&#xff1a;在系统首页可以查…

Openstack云计算框架及前期服务搭建

openstack介绍 Openstack是一个开源的云计算管理平台项目&#xff0c;由几个主要的组件组合起来完成具体工作&#xff0c;支持几乎所有的云环境&#xff0c;项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台 ----百度百科 Openstack是一个云操作系统&a…

HTML+CSS:动态搜索框

效果演示 这段代码实现了一个简单的搜索栏效果。页面背景为从天蓝色到深蓝色的渐变色&#xff0c;搜索栏包括一个圆形背景的搜索图标和一个输入框。当用户点击搜索图标时&#xff0c;输入框会从搜索图标的位置滑出&#xff0c;显示一个输入框和一个清除按钮。用户可以在输入框中…

PyTorch概述(二)---MNIST

NIST Special Database3 具体指的是一个更大的特殊数据库3&#xff1b;该数据库的内容为手写数字黑白图片&#xff1b;该数据库由美国人口普查局的雇员手写 NIST Special Database1 特殊数据库1&#xff1b;该数据库的内容为手写数字黑白图片&#xff1b;该数据库的图片由高…

网关服务gateway注册Consul时报错Consul service ids must not be empty

网关服务gateway启动时&#xff0c;初始化Consul相关配置时报错。 Consul service ids must not be empty, must start with a letter, end with a letter or digit, and have as interior characters only letters, digits, and hyphen: cbda-server-gateway:10.111.236.142:…

Web3的奇迹:数字世界的新篇章

在数字化时代的潮流中&#xff0c;Web3正以其令人振奋的潜力和前景引领着我们进入一个全新的数字时代。作为互联网的下一代&#xff0c;Web3将重新定义我们对数字世界的认知和体验&#xff0c;为我们带来无限的可能性和奇迹。本文将深入探讨Web3的重要性、核心特征以及未来展望…