当前位置: 首页 > news >正文

【力扣hot100】刷题笔记Day13

前言

  • 元宵节快乐 ~ 周六在图书馆快乐刷题!继续二叉树🍴

543. 二叉树的直径 - 力扣(LeetCode)

  • 递归后序

    • class Solution:def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:self.res = 0  # 记录最长路径# 递归求最大深度def depth(node):if not node:return 0l = depth(node.left)   # 左子树最大深度r = depth(node.right)  # 右子树最大深度self.res = max(self.res, l + r)  # 两边深度相加就是最长路径return max(l, r) + 1  # 返回当前最大深度depth(root)return self.res

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

  • 递归前序

    • class Solution:def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:def helper(left, right):if left > right: return     # left == right也可以返回一个结点mid = (left + right) // 2root = TreeNode(nums[mid])         # 构造根节点root.left = helper(left, mid-1)    # 比根节点小的为左子树root.right = helper(mid+1, right)  # 比根节点大的为右子树return rootreturn helper(0, len(nums)-1)

 98. 验证二叉搜索树 - 力扣(LeetCode)

  • 递归BST

    • 容易忽略上下界问题,详看题解
    • class Solution:def isValidBST(self, root: Optional[TreeNode]) -> bool:# 递归判断当前结点的值是否在上下界内def helper(node, minVal, maxVal):if not node:return True# 每个节点如果超过这个范围,直接返回falseif node.val >= maxVal or node.val <= minVal:return False# 左子树范围的最小值是minVal,最大值是当前节点的值,因为左子树的值要比当前节点小l = helper(node.left, minVal, node.val)# 右子树范围的最大值是maxVal,最小值是当前节点的值,因为右子树的值要比当前节点大r = helper(node.right, node.val, maxVal)return l and r# 初始上下界无限大,python用浮点数表示整数最大最小return helper(root, -float('inf'), float('inf'))  
  •  递归中序

    • class Solution:# def __init__(self):#     self.pre = None  # 公共变量def isValidBST(self, root: Optional[TreeNode]) -> bool:self.pre = None  # 私有变量,记录上一个结点def helper(root):if not root: return Truel = helper(root.left)   # 左if self.pre and self.pre.val >= root.val:return False        # 中self.pre = rootr = helper(root.right)  # 右return l and rreturn helper(root)
  • 迭代中序

    • class Solution:def isValidBST(self, root: Optional[TreeNode]) -> bool:if not root:return Truest = []pre = -float('inf')while st or root:while root:st.append(root)root = root.lefttemp = st.pop()if temp.val <= pre:return Falsepre = temp.valroot = temp.rightreturn True

230. 二叉搜索树中第K小的元素 - 力扣(LeetCode)

  • 迭代中序

    • class Solution:def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:st = []while st or root:while root:st.append(root)root = root.lefttemp = st.pop()k -= 1if k == 0: return temp.val  # 遍历到第k个结点root = temp.right
  • 优化查找

    • # 扩展TreeNode
      class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightself.node_num = 0  # 以该结点为根结点的子树的结点数# 构造可供查找的MyBst类
      class MyBst:def __init__(self, root: TreeNode):self.root = rootself._count_node_num(root)  # 初始化时计算每个结点为根结点的子树的结点数def kth_smallest(self, k: int):node = self.rootwhile node:left = node.left.node_num if node.left else 0  # 获取左子树的结点数if left < k - 1:node = node.right  # 移动到右子树查找k -= left + 1  # 更新 k 值elif left == k - 1:return node.val  # 当前结点即为第 k 小的结点else:node = node.left  # 移动到左子树查找def _count_node_num(self, node) -> int:if not node:return 0# 递归计算以当前结点为根结点的子树的结点数node.node_num = 1 + self._count_node_num(node.left) + self._count_node_num(node.right)return node.node_num  # 返回以当前结点为根结点的子树的结点数class Solution:def kthSmallest(self, root: TreeNode, k: int) -> int:bst = MyBst(root)return bst.kth_smallest(k)  # 调用 MyBst 类的方法来找出第 k 小的结点的值

199. 二叉树的右视图 - 力扣(LeetCode) 

  • 迭代层序BFS

    • class Solution:def rightSideView(self, root: Optional[TreeNode]) -> List[int]:if not root: return []res = []q = deque()q.append(root)while q:n = len(q)  # 先存长度以防变化for i in range(n):cur = q.popleft()if cur.left: q.append(cur.left)if cur.right: q.append(cur.right)if i == n - 1:  # 本层最后一个结点res.append(cur.val)return res
  • 递归逆先序DFS

    • # 思路类似【层序遍历】的 DFS递归
      class Solution:def rightSideView(self, root: Optional[TreeNode]) -> List[int]:self.res = []# 传入层当前深度def dfs(root, depth):if not root: returnif depth == len(self.res):self.res.append(root.val)  # 中dfs(root.right, depth + 1)     # 右dfs(root.left, depth + 1)      # 左dfs(root, 0)return self.res

后言

  • 刷简单的二叉树题就是爽,递归的代码简短可以一次AC,还有精力去理解别的解法!多亏了之前刷代码随想录打的基础,感觉多刷一两次就可以看到就写出来了!刷二叉树信心MAX

相关文章:

  • BlackberryQ10 是可以安装 Android 4.3 应用的,Web UserAgent 版本信息
  • React歌词滚动效果(跟随音乐播放时间滚动)
  • LeetCode刷题笔记之回溯算法(一)
  • 从ChatGPT到Sora,来了解大模型训练中的存储
  • 记录 | docker内修改host方法
  • Android14之input高级调试技巧(一百八十八)
  • C++ 学习之函数对象
  • Stable Diffusion 绘画入门教程(webui)-ControlNet(深度Depth)
  • Day13-Linux系统用户管理知识精讲2
  • Java架构师之路六、高并发与性能优化:高并发编程、性能调优、线程池、NIO、Netty、高性能数据库等。
  • Movelt使用笔记-Movelt Setup Assistant
  • C# OpenCvSharp Tracker 目标追踪
  • ✅技术社区项目—JWT身份验证
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • 【黑马程序员】2、TypeScript介绍_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程
  • 【Leetcode】104. 二叉树的最大深度
  • github从入门到放弃(1)
  • If…else
  • JavaScript HTML DOM
  • webpack4 一点通
  • webpack入门学习手记(二)
  • 阿里云购买磁盘后挂载
  • 第十八天-企业应用架构模式-基本模式
  • 对象管理器(defineProperty)学习笔记
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 我与Jetbrains的这些年
  • 学习笔记TF060:图像语音结合,看图说话
  • 7行Python代码的人脸识别
  • gunicorn工作原理
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​力扣解法汇总946-验证栈序列
  • (2)STM32单片机上位机
  • (2022 CVPR) Unbiased Teacher v2
  • (JS基础)String 类型
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (ZT)薛涌:谈贫说富
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (过滤器)Filter和(监听器)listener
  • (蓝桥杯每日一题)love
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (一)u-boot-nand.bin的下载
  • (转)iOS字体
  • ./和../以及/和~之间的区别
  • .NET CLR基本术语
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net framework4与其client profile版本的区别
  • .NET MVC之AOP
  • .Net6 Api Swagger配置
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET简谈设计模式之(单件模式)
  • .net与java建立WebService再互相调用
  • .NET中两种OCR方式对比
  • [].slice.call()将类数组转化为真正的数组
  • [2016.7 day.5] T2
  • [20190401]关于semtimedop函数调用.txt