【力扣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

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

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

相关文章

使用python写一个修改execl表格的脚本

使用的前提记得安装python的环境。 import os import pandas as pddef listdir(path): #传入根目录file_list []for file in os.listdir(path):file_path os.path.join(path, file) #获取绝对路径if os.path.isdir(file_path): #如果还是文件夹&#xff0c;就继续迭代本函数…

GPT-4:开启人工智能新纪元的多功能引擎

随着人工智能技术的飞速发展&#xff0c;GPT-4&#xff08;Generative Pre-trained Transformer 4&#xff09;作为最新一代的语言模型&#xff0c;已经成为了推动科技创新、优化人机交互体验的关键力量。本文将深入探讨GPT-4的核心作用&#xff0c;以及它如何在各个领域中展现…

STM32通用定时器输入捕获

通用定时器输入捕获部分框图介绍 通用定时器输入捕获脉宽测量原理 要测量脉宽的高电平的时间&#xff1a;t2-t1&#xff08;脉宽下降沿时间点-脉宽上升沿时间点&#xff09; 假设&#xff1a;递增计数模式 ARR&#xff1a;自动重装载寄存器的值 CCRx1&#xff1a;t1时间点CCRx…

2024最新可用免费天气预报API接口

天气API接口数据, 数据字段最全&#xff0c;免费&#xff0c;稳定的实况天气预报接口 5分钟左右更新一次&#xff0c;支持全国3000多个市区县, 包含基本天气信息、24小时逐小时天气、气象预警列表、湿度、能见度、气压、降雨量、紫外线、风力风向风速、日出日落、空气质量、pm2…

细粒度目标检测问题剖析

问题剖析 相对于一般目标检测任务&#xff0c;细粒度目标更容易出现类内差异大、类间差异小等现象。 所谓细粒度目标识别&#xff0c;是指在目标检测的基础上&#xff0c;识别出目标的具体型号与类别&#xff0c;例如不只识别出飞机目标&#xff0c;还能识别出飞机型号。粗粒…

洛谷P1106题解

题目描述 键盘输入一个高精度的正整数 N&#xff08;不超过 250 位&#xff09;&#xff0c;去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N 和 k&#xff0c;寻找一种方案使得剩下的数字组成的新数最小。 输入格式 输入两行正整数。…

Google炸场,推出开“放”可商用的大语言模型Gemma!超级轻量,个人电脑即可运行

与OpenAI的封闭式大型模型不同&#xff0c;谷歌、Meta等科技巨头正致力于开发开源模型&#xff0c;以期实现技术上的快速追赶。 介绍 2月21日&#xff0c;谷歌发布了其最新一代的开源AI模型——Gemma&#xff08;https://ai.google.dev/gemma&#xff09;&#xff0c;这是一个…

2024.2.29 模拟实现 RabbitMQ —— 项目展示

目录 项目介绍 核心功能 核心技术 演示直接交换机 演示扇出交换机 演示主题交换机 项目介绍 此处我们模拟 RabbitMQ 实现了一个消息队列服务器 核心功能 提供了 虚拟主机、交换机、队列、绑定、消息 概念的管理九大核心 API 创建队列、销毁队列、创建交换机、销毁交换机、…

【LeetCode】升级打怪之路 Day 06:哈希表的应用

今日题目&#xff1a; 349. 两个数组的交集 | LeetCode202. 快乐数 | LeetCode1. 两数之和 | LeetCode205. 同构字符串 | LeetCode599. 两个列表的最小索引总和 | LeetCode 目录 应用 1 -- 哈希集合LeetCode 349. 两个数组的交集 【easy】LeetCode 202. 快乐数 【小技巧】 应用…

基于JSP的毕业设计选题系统的设计与实现

基于JSP的毕业设计选题系统的设计与实现 (源代码论文) A. 项目简介 毕业设计选题系统就是能够使学生通过互联网完成毕业设计课题的选定&#xff0c;它采用Web方式&#xff0c;同时适用于局域网和Internet&#xff0c;它要实现审核&#xff0c;权限管理&#xff0c;邮件通知…

Python中的atexit模块:优雅地处理程序退出

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 atexit模块概述 atexit模块的基本用法 示例代码&#xff1a;文件操作时的应用场景 典型应用场景 1 资源释放…

【Java】Deque接口与List接口中的remove方法

Deque接口与List接口中的remove方法的区别 太长不看系列&#xff1a; Deque的remove(Object o)。指定的是元素&#xff0c;List的remove(int index)&#xff0c;指定的是索引。 在刷力扣113.路径总和 II 时使用Deque的remove方法出现错误&#xff0c;记录一下原因和理清相关概念…

云里物里轻薄系列电子价签,如何革新零售?

云里物里的DS轻薄系列电子价签&#xff0c;凭借轻巧外观和强劲性能&#xff0c;为零售行业提供了更便捷的商品改价方案。这不仅是对纸质价标的替代&#xff0c;更以其安全性和可持续发展性&#xff0c;实现对零售行业的效率升级&#xff0c;让商家们轻松迎接数字化时代的挑战&a…

【Vue3】学习watch监视:深入了解Vue3响应式系统的核心功能(下)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

OD(9)之Mermaid序列图(Sequence diagrams)使用详解

OD(8)之Mermaid序列图(Sequence diagrams)使用详解 Author: Once Day Date: 2024年2月21日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermiad使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charti…

C++实现Date类

Date.h #pragma once#include <iostream> using std::cout; using std::endl;class Date { private:int _year 1;int _month 1;int _day 1;public://日期类无需显式定义拷贝构造函数、析构函数、赋值运算符重载//打印void Print();//有参构造函数Date(int year 1, i…

4.4 MySQL存储

目录 1、使用前提 2、使用连接数据库最初步骤 2.1 最初步骤 2.2 connect()方法中参数简单传递 3、创建数据库(创建架构)和创建表 3.1 创建数据库(创建架构) 3.2 创建表 3.2.1 基本创建 3.2.2 创建自增主键 4、Pycharm 可视化连接 MySQL 图形界面 5、插入、更新、查询…

【蓝桥杯】青蛙跳杯子(BFS)

一.题目描述 二.输入描述 输入为 2 行&#xff0c;2 个串&#xff0c;表示初始局面和目标局面。我们约定&#xff0c;输入的串的长度不超过 15。 三.输出描述 输出要求为一个整数&#xff0c;表示至少需要多少步的青蛙跳。 四.问题分析 注意&#xff1a;空杯子只有一个 …

3种SQL语句优化方法,测试人必知必会!

关于SQL语句的优化&#xff0c;本质上就是尽量降低SQL语句的执行时间&#xff0c;对于如何降低SQL语句的执行时间&#xff0c;可以从以下几个方面入手。 一、降低SQL语句执行时的资源消耗 这是我们在数据库性能调优中常用的方法&#xff0c;该方法以分析SQL语句的执行计划为切…

Qt程序设计-报警灯自定义控件实例

本文讲解Qt报警灯自定义控件实例。 实现功能 设置边框和内部颜色。 设置是否闪烁点亮。 添加的报警灯类 #ifndef LIGHT_H #define LIGHT_H#include <QWidget> #include <QDebug> #include <QPainter> #include <QTimer>class Light : public QWid…