代码随想录学习Day 18

530.二叉搜索树的最小绝对差

题目链接

讲解链接

思路:利用二叉搜索树的性质,其中序遍历序列是一个有序数组。所以先对二叉搜索树进行中序遍历,得到一个递增的数组后,再遍历整个数组,依次求相邻值的差,最后返回最小的差值即可。

class Solution:def __init__(self):self.vec = []def traversal(self, root):  # 递归中序遍历if not root:returnself.traversal(root.left)self.vec.append(root.val)self.traversal(root.right)def getMinimumDifference(self, root: Optional[TreeNode]) -> int:sub = []  # 保存所有差值的数组self.traversal(root)for i in range(1, len(self.vec)):sub.append(abs(self.vec[i] - self.vec[i - 1]))return min(sub)  # 返回数组中的最小值

采用双指针法可以省去开辟数组的过程,需要用一个pre节点记录一下cur节点的前一个节点。

class Solution:def __init__(self):self.result = float('inf')  # 初始化一个最大值self.pre = Nonedef traversal(self, cur):if cur is None:returnself.traversal(cur.left)  # 左if self.pre is not None:  # 中self.result = min(self.result, cur.val - self.pre.val)  # 第一个节点不进行比较self.pre = cur  # 让pre指向curself.traversal(cur.right)  # 右def getMinimumDifference(self, root):self.traversal(root)return self.result

501.二叉搜索树中的众数

题目链接

讲解链接

首先想到的是用一个字典来保存树中所有的值及其出现的次数,实现map映射。将出现次数最多的元素统计出来并保存到列表中。

class Solution:def __init__(self):self.dic = dict()  # 创建字典def traversal(self, root):  # 递归遍历if not root:return Noneself.traversal(root.left)if root:self.dic[root.val] = self.dic.get(root.val, 0) + 1  # 记录树中所有元素及出现的次数self.traversal(root.right)def findMode(self, root: Optional[TreeNode]) -> List[int]:result= []  # 定义列表保存结果self.traversal(root)  # 遍历树max_val = max(self.dic.values())  # 求字典中最大值for key, value in self.dic.items():  # 找到字典中最大值所对应的所有key,即为出现频次最高的元素if value == max_val:result.append(key)  # 将结果添加至列表中return result

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

题目链接

讲解链接

求最小公共祖先,需要从底向上遍历,那么只能通过后序遍历(即回溯)实现从底向上的遍历。

重点:节点本身也可以算作是公共祖先。

递归三部曲:
1.递归函数参数及返回值:参数为根节点和要查找的p,q节点,返回值为TreeNode。

def lowestCommonAncestor(self, root, p, q)

2.递归终止条件:遇到空则返回空;找到root == q,或者root == p,说明找到 q p ,则将其返回 。

if root == p or root == q or not root:return root

3.单层递归逻辑:本题需要遍历整棵树,先用left和right接住左子树和右子树的返回值。如果left 和 right都不为空,说明此时root就是最近公共节点。如果left为空,right不为空,就返回right,说明目标节点是通过right返回的

left = self.lowestCommonAncestor(root.left, p, q)
right = self.owestCommonAncestor(root.right, p, q)
if not left and right:return right
elif left and not right:return left
else:return None

整体的查找流程如图:

完整代码如下:

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if root == q or root == p or not root:  # p或q本身为公共祖先也考虑到了return rootleft = self.lowestCommonAncestor(root.left, p, q)right = self.lowestCommonAncestor(root.right, p, q)if left and right:return rootif not left and right:return rightelif left and not right:return leftelse: return None

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

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

相关文章

漏洞扫描-让安全弱点无所遁形

随着信息技术的迅猛发展和互联网的广泛普及,网络安全问题日益凸显。在这个数字化的世界里,无论是企业还是个人,都面临着前所未有的安全威胁。安全漏洞,作为这些威胁的源头,常常被忽视或无法及时发现。 而漏洞扫描&…

静态住宅IP优缺点,究竟要怎么选?

在进行海外 IP 代理时,了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和,并提供选择建议,帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

经验篇04-为什么学了很多知识/读了很多书却没用

前言 以下内容是参加古典老师的写作训练营,古典老师分享的视频课程,对于喜欢阅读或者学习的人来说,可以揭开【学了很多东西却没用】这个问题的神秘面纱,我个人收获非常大,结合了一些自己的理解,形成此文&am…

java常用IO流功能——字符流和缓冲流概述

前言: 整理下学习笔记,打好基础,daydayup! 之前说了下了IO流的概念,并整理了字节流,有需要的可以看这篇 java常用应用程序编程接口(API)——IO流概述及字节流的使用 字符流 FileReader(文件字…

代码随想录算法训练营Day35|LC860 柠檬水找零LC406 根据身高重建队列LC452 用最少数量的箭引爆气球

一句话总结:身高队列看起来不简单,实际上也很难。 原题链接:860 柠檬水找零 简单贪心思想即可。5元时加入cnt5,10元时cnt10,cnt5--, 20元时则优先找零10元再找零5元,这样最后判断是否在一次找零…

超全整理,软件测试-性能测试流程汇总,看这一篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试&#xf…

2024年蓝牙耳机怎么选?五大爆火真无线蓝牙耳机推荐大公开!

​随着科技的进步,越来越多的用户倾向选择无线蓝牙耳机,摆脱有线耳机的束缚,享受更加自由的音乐体验。为了帮助大家选购到适合自己的蓝牙耳机,我整理了一些目前市面上我个人认为性能优异的款式,与大家分享。 一、蓝牙耳…

通科技新品亮相:4K60编解一体,USB透传无忧

在信息化快速发展的今天,音视频技术的需求与应用场景日益丰富,特别是在对视频画质和实时性要求极高的领域中,如军警、公安、金融等,对音视频处理设备的性能要求更为严格。为满足这些高端应用场景的需求,视通科技紧跟时…

【Node.js从基础到高级运用】十八、Node.js的安全性加固

引言 在Web开发中,安全性是一个不可忽视的话题。Node.js作为一个流行的后端平台,同样需要关注各种潜在的安全威胁,并采取措施加以防御。本文将介绍如何在Node.js应用中防御常见的Web攻击,以及如何使用安全相关的中间件来加固安全性…

MySQL-1.数据库的基本操作

1. 数据库的基本操作 show databases; information_schema:信息图式,存储服务器管理数据库的信息 mysql:存放系统信息,用户名密码等 performance_schema:性能图式 sys:系统文件 1.1 创建数据库-studen…

套娃式大小AI群体导致AI觉醒吗?

一、“套娃式”AI训练 目前,我们所讨论的人工智能(AI)主要是基于机器学习和深度学习技术的算法系统。它们通过不断学习、优化和改进以完成特定任务,但并不具备自我意识或者独立的创造性思考能力,即“觉醒”。 “套娃式…

RHCE作业:搭建web网站

综合练习: 请给openlab搭建web网站 网站需求: 1.域名访问网站 基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.创建界面 给该公司创建三个子界面分别显示学生信息,教学资料 和缴费网站,基于www.openlab.com…

Splashtop 荣获2024年 Globee® 卓越网络安全两大奖项

2024年3月25日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公领域处于领先地位,我们自豪地宣布荣获全球卓越企业权威机构 Globee 奖。Splashtop 凭借其安全工作空间解决方案(即插即用安全访问平台,使 IT 部门能够简化零信任的实施&#xf…

算法笔记~—位运算

目录 常见位运算: 1、基础位运算 2、对于一个数n。确定、修改这个数n二进制x位。 3、提取(确定)一个数n最右侧的1(bit)与干掉最右侧的1(bit) 4、异或运算律 5、位运算的优先级&#xff1a…

vscode 配置c++环境——3个文件搞定!!!

前提: 在vscode中安装了c扩展 创建文件settings.json {"files.associations": {"string": "cpp","vector": "cpp","array": "cpp","atomic": "cpp","*.tcc"…

[C++]函数重载(什么是函数重载,函数重载的原理(底层怎么实现))

一、什么是函数重载 函数重载是指在同一作用域内,可以有多个功能类似具有相同函数名,不同参数列表(包括参数类型、参数个数、参数顺序)的函数。编译器会根据函数调用时提供的参数来决定调用哪一个具体的函数。 注意:只…

QT gridlayout 循环设置组件,表格也通用 已解决

在需求中。经常遇到,表格 展示需求。 几乎都是json格式的。 // 列表配置文件QJsonArray listJsonArray getCfgJsonData("details_tab_table_config.json");if (listJsonArray.isEmpty()){return;}ui->gridWidget->setMaximumSize(QSize(310, 180)…

Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应

Vant Weapp 1.0 版本开始支持van-uploader组件&#xff0c;请先确认好版本号和引用路径正确&#xff01;&#xff01; <van-uploader file-list"{{ fileList }}" deletable"{{ true }}" />1. 上传无反应 微信小程序用了van-uploader&#xff0c;但是…

第G5周:Pix2Pix理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 一、背景知识 1.1 图像翻译 图像内容&#xff08;Image Content&#xff09;&#…

冒泡排序 快速排序 归并排序 其他排序

书接上回.. 目录 2.3 交换排序 2.3.1冒泡排序 2.3.2 快速排序 快速排序的优化: 快速排序非递归 2.4 归并排序 基本思想 归并排序非递归 海量数据的排序问题 排序算法时间空间复杂度和稳定性总结 四. 其他非基于比较排序 (了解) 2.3 交换排序 基本思想&#xff1a;…