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

2024-04-01 22:36

本文主要是介绍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

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

这篇关于2024.(3.30和4.1)力扣刷题记录-二叉树学习记录2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868312

相关文章

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定