2024.(3.30和4.1)力扣刷题记录-二叉树学习记录2

一、学习视频

如何灵活运用递归?【基础算法精讲 10】_哔哩哔哩_bilibili

二、跟练代码

1. 100. 相同的树

递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:# 递归if p is None and q is None:return Trueelif p is None or q is None:return Falseleft = self.isSameTree(p.left,q.left)right = self.isSameTree(p.right,q.right)return left and right and p.val == q.val

学习一下灵神的写法,来自视频。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:# 递归# if p is None and q is None:#     return True# elif p is None or q is None:#     return Falseif p is None or q is None:return p is qleft = self.isSameTree(p.left,q.left)right = self.isSameTree(p.right,q.right)return left and right and p.val == q.val

2.101. 对称二叉树

递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def isSymmetric(self, root: Optional[TreeNode]) -> bool:# 递归# 含有根节点# 判断根节点的左右两子树def f(left: Optional[TreeNode], right: Optional[TreeNode]) -> bool:if left is None or right is None:return left is rightreturn f(left.left,right.right) and f(left.right,right.left) and left.val == right.val# #根节点为空时是满足的,此处含根节点可以省去# if root is None:    #     return Truereturn f(root.left,root.right)

3.110. 平衡二叉树

递归。不会,来自视频代码。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def isBalanced(self, root: Optional[TreeNode]) -> bool:# 递归# 计算高度,非负数# 用-1表示不是平衡二叉树def f(node) -> int:if node is None:return 0# left_h = f(node.left)# right_h = f(node.right)# if left_h == -1 or right_h == -1 or abs(left_h - right_h) > 1:#     return -1# return max(left_h, right_h) + 1# 少递归一些left_h = f(node.left)if left_h == -1:return -1right_h = f(node.right)if right_h == -1 or abs(left_h - right_h) > 1:return -1return max(left_h, right_h) + 1return f(root) != -1

4.199. 二叉树的右视图

递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def rightSideView(self, root: Optional[TreeNode]) -> List[int]:# 递归# 先右后左遍历,当高度大于minHeight时,才会露出来ans = []minHeight = 0def f(node,height):nonlocal minHeightif node is None:return if height > minHeight:ans.append(node.val)minHeight += 1right = f(node.right,height + 1)left = f(node.left,height + 1)return f(root,1)return ans

三、课后作业

1.226. 翻转二叉树

递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:# 递归if root is None:return Noneleft = self.invertTree(root.left)   #左子树right = self.invertTree(root.right) #右子树root.left = right   #左右互换root.right = leftreturn root

2.1026. 节点与其祖先之间的最大差值

不会,全都来自灵神题解(. - 力扣(LeetCode)),学习学习。

(1)递

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def maxAncestorDiff(self, root: Optional[TreeNode]) -> int:# 递v = -1def f(node,mx,mn):nonlocal vif node is None:return  #不一定要有返回值mx = max(mx,node.val)mn = min(mn,node.val)v = max(v, node.val - mn, mx - node.val)    #更新f(node.left,mx,mn)f(node.right,mx,mn)f(root, root.val, root.val)     #根节点存在return v

(2)递的优化

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def maxAncestorDiff(self, root: Optional[TreeNode]) -> int:# 递的优化v = -1def f(node,mx,mn):if node is None:nonlocal vv = max(v, mx - mn)    #到终点更新returnmx = max(mx,node.val)mn = min(mn,node.val)f(node.left,mx,mn)f(node.right,mx,mn)f(root, root.val, root.val)     #根节点存在return v

(3)归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def maxAncestorDiff(self, root: Optional[TreeNode]) -> int:# 归v = -1def f(node):if node is None:return inf, -inf    # min maxmn = mx = node.vallmin, lmax = f(node.left)rmin, rmax = f(node.right)mn = min(mn, lmin, rmin)mx = max(mx, lmax, rmax)nonlocal v# 每一次都更新vv = max(v, node.val - mn, mx - node.val)return mn, mxf(root)return v

递可以不用每次都更新v值,因为从上到下能确保最大小值就是该条路径的,而没有受其他路径影响;而归每次都需更新v值,一个节点有左右两边两条路径到达。

3.1080. 根到叶路径上的不足节点

(1)递归。参考官方题解(. - 力扣(LeetCode))。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def sufficientSubset(self, root: Optional[TreeNode], limit: int) -> Optional[TreeNode]:# 递归# 递总值 归是否删除(False删)def f(node, s):if node is None:return Falseif node.left is None and node.right is None:return s + node.val >= limitleft = f(node.left, s + node.val)right = f(node.right, s + node.val)if not left:node.left = Noneif not right:node.right = Nonereturn left or rightrootBool = f(root, 0)return root if rootBool else None

注意删除节点不能本节点直接删除,要在上一节点删除(删除联系)。

(2)递归(调用自身写法)。参考灵神题解(. - 力扣(LeetCode))。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def sufficientSubset(self, root: Optional[TreeNode], limit: int) -> Optional[TreeNode]:# 递归(调用自身写法)# 通过更改limit实现求和的作用if root is None:return Noneif root.left is root.right: #为叶子节点return root if root.val >= limit else Noneroot.left = self.sufficientSubset(root.left, limit - root.val)root.right = self.sufficientSubset(root.right, limit - root.val)return root if root.left or root.right else None

可以通过 root.left is root.right 来判断是不是叶子节点。

4.1372. 二叉树中的最长交错路径

(1)递归+非局部变量

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def longestZigZag(self, root: Optional[TreeNode]) -> int:# 递归+非局部变量# 递标签,归和值ans = 0def f(node: Optional[TreeNode], flag: str) -> int:nonlocal ansif node is None:return 0left = f(node.left, 'left')right = f(node.right, 'right')if flag == 'left':  #该节点是父节点的左节点,下一步该右节点ans = max(ans, left)    #更新左节点和值return right+1      #继续归右节点和值else:ans = max(ans, right)return left+1# 更新最终返回值ans = max(f(root.left,"left"),f(root.right,"right"),ans)return ans

(2)递归+非局部变量2。来自题解(. - 力扣(LeetCode)),很妙很妙。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def longestZigZag(self, root: Optional[TreeNode]) -> int:# 递归+非局部变量2ans = 0def f(node, l, r):  #递左右最大值nonlocal ansans = max(ans, l, r)if node.left:f(node.left, r+1, 0)if node.right:f(node.right, 0, l+1)f(root, 0, 0)return ans

感谢你看到这里!一起加油吧!

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

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

相关文章

Makefile:调用shell脚本和嵌套调用多项目编译(九)

1、Makefile中调用shell脚本 Makefile中可以通过使用$(shell 指令)的方式调用shell脚本a指令:输出当前文件夹下的所有文件b指令:输出当前路径c指令:如果当前目录下不存在abc文件那么创建一个abc的文件 a$(shell ls ./) b$(shell pwd) filen…

关于简单又挣钱的冷门美团项目,美团圈圈

大家好,最近美团又开始搞事情了。接连推出了好几个网推项目,让一大波人都吃上了肉了。 美团的项目很简单,就是给它们的活动做推广。用户只需要拿到它推广的链接,然后去扫码进群就可以了。只要用户保持8天不退就行了。 下面是体验…

揭开AI编程语言Mojo比Pyhon快6.8万倍的5个秘密!

最近(2024年3月29日),号称比Python快6.8万倍的Mojo编程语言开源啦!6.8万倍?你敢相信这个数字是真的吗?不过,就连Mojo官网都把这个结果贴了出来(见下图),这就很…

Spring Boot的基础知识和应用

在快速发展的软件开发领域,Spring Boot已经成为了一个广受欢迎的框架,它极大地简化了Spring应用的初始搭建以及开发过程。Spring Boot遵循“约定优于配置”的原则,通过默认配置减少了开发者的配置工作量,使得开发者能够更专注于业…

线程池小项目【Linux C/C++】(踩坑分享)

目录 前提知识: 一,线程池意义 二,实现流程 阶段一,搭建基本框架 1. 利用linux第三方库,将pthread_creat线程接口封装 2. 实现基本主类ThreadPool基本结构 阶段二,完善多线程安全 1. 日志信息打印…

如何利用OceanBase v4.2的 Runtime Filter提升查询效率

OceanBase数据库中可使用Hash Join联接算法,这种算法可以依据某些字段对两个表进行等值匹配连接。然而,当涉及连接的表(特别是作为Probe Table的表)数据量较大时,Hash Join的性能会显著下降。针对这一问题,…

[蓝桥杯 2023 省 A]填空问题1

A. 幸运数 小蓝认为如果一个数含有偶数个数位,并且前面一半的数位之和等于后面一半的数位之和,则这个数是他的幸运数字。例如 23142314 是一个幸运数字,因为它有 44 个数位,并且 23142314。现在请你帮他计算从 11 至 10000000010…

若依框架时间比较的坑(DATE_FORMAT)

背景 - 想做生日的比较 若依自带的比较 <if test"params.beginTime ! null and params.beginTime ! "><!-- 开始时间检索 -->AND date_format(u.create_time,%y%m%d) > date_format(#{params.beginTime},%y%m%d)</if><if test"params…

AJAX —— 学习(三)

目录 一、jQuery 中的 AJAX &#xff08;一&#xff09;get 方法 1.语法介绍 2.结果实现 &#xff08;二&#xff09;post 方法 1.语法介绍 2.结果实现 &#xff08;三&#xff09;通用型的 AJAX 方法 1.语法介绍 2.结果实现 二、AJAX 工具库 axios &#xff08;…

java实现小程序授权登录以及获取手机号

1、引入依赖 <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>4.1.0</version></dependency>2、引入封装好的工具类 import cn.binarywang.wx.miniapp.api.WxMaS…

Opencv各个颜色空间、用途(颜色通道分割与合并)

Opencv各个颜色空间、用途&#xff08;颜色通道分割与合并&#xff09; OpenCV中提供了多种颜色空间&#xff0c;每种颜色空间都有其特定的用途。以下是一些常见的颜色空间及其用途&#xff1a; BGR颜色空间&#xff1a;BGR颜色空间是一种与计算机显示器显示的颜色相同的颜色…

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言&#xff0c;采用经典遗传算法&#xff08;GA&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. 代码片段参…

【Qt】Ubuntu20.04.6+Qt5.15.2+QtCreator10.0.1无法输入中文

1、前提条件 1)已经安装了fcitx sudo apt install fcitx sudo apt install fcitx-pinyin sudo apt install fcitx-bin fcitx-table-all sudo apt install fcitx-qt52)系统已经配置fcitx 3)将系统下 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx…

计算机考研408有向无环图描述表达式可靠构造方法

目录 前言目标&#xff08;以王道书为例&#xff09;构造方法1. 建树2. 后序遍历1. a2. b3. 4. b5. c6. d7. 8. *9. *10. c 前言 对王道视频中的分层合并思想不是很满意&#xff0c;笔者提出自己的构造方法。 目标&#xff08;以王道书为例&#xff09; 构造方法 笔者通过王…

Doris实践——同程数科实时数仓建设

目录 前言 一、早期架构演进 二、Doris和Clickhouse选型对比 三、新一代统一实时数据仓库 四、基于Doris的一站式数据平台 4.1 一键生成任务脚本提升任务开发效率 4.2 自动调度监控保障任务正常运行 4.3 安全便捷的可视化查询分析 4.4 完备智能的集群监控 五、收益与…

线控悬架系统分析

线控悬架系统分析 附赠自动驾驶学习资料和量产经验&#xff1a;链接 1 线控悬架系统系统发展现状 • 车辆驾乘过程中&#xff0c;操控性和舒适性是两个重要的评价指标&#xff0c;两者很难兼顾&#xff1b; • 线控悬架就是根据路况实际情况自动调节悬架的高度、刚度、阻尼实…

012_control_flow_in_Matlab中的控制流

Matlab中的控制流 虽然&#xff0c;我们说Matlab中的计算是向量化的&#xff0c;但是在某些情况下&#xff0c;作为一个“程序设计语言”&#xff0c;Matlab也提供了一些控制流结构&#xff0c;来帮助我们实现一些复杂的逻辑。 我会在介绍控制流的时候&#xff0c;提醒如何用…

Ansys Zemax | 如何将光栅数据从Lumerical导入至OpticStudio(上)

附件下载 联系工作人员获取附件 本文介绍了一种使用Ansys Zemax OpticStudio和Lumerical RCWA在整个光学系统中精确仿真1D/2D光栅的静态工作流程。将首先简要介绍方法。然后解释有关如何建立系统的详细信息。 本篇内容将分为上下两部分&#xff0c;上部将首先简要介绍方法工…

Python喜马拉雅免费音频数据爬取部署

1. 代码下载 github代码 https://github.com/toilaj/xmly-downloader/tree/main 只能下载免费音频&#xff0c;vip不能下载。 2. 环境部署 下载miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh或者链接下载&#xff0c; 寻找linux版…

【Leetcode】top 100 技巧

136 只出现一次的数字 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 技巧&#xff1a…