【力扣hot100】刷题笔记Day11

news2024/11/15 17:22:04

前言

  • 科研不顺啊......又不想搞了,随便弄弄吧,多花点时间刷题,今天开启二叉树!

94. 二叉树的中序遍历 - 力扣(LeetCode)

  • 递归

    • # 最简单递归
      class Solution:
          def inorderTraversal(self, root: TreeNode) -> List[int]:
              if not root:
                  return []
              return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
              # 前/后序就换一下顺序
      
      # 通用模板        
      class Solution:
          def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
              res = []  # 收集结果
              def dfs(root):
                  if not root:  # 访问到空结点直接返回
                      return
                  # 前后序就以下换成对应顺序
                  dfs(root.left)        # 左
                  res.append(root.val)  # 中
                  dfs(root.right)       # 右
              dfs(root)
              return res
  • 迭代

    • 图和代码参考王尼玛题解
    • class Solution:
          def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
              res = []
              stack = []
              while stack or root:
                  # 不断往左子树方向走,每走一次就将当前节点保存到栈中
      			# 这是模拟递归的调用
                  while root:
                      # res.append(root.val)  # 前/后序改到这
                      stack.append(root)
                      root = root.left  # 后序改成right
                  # 当前节点为空,说明左边走到头了,从栈中弹出节点并保存
      			# 然后转向右边节点,继续上面整个过程
                  temp = stack.pop()
                  res.append(temp.val)  # 前/后序删掉
                  root = temp.right  # 后序改成left
              return res  # 后序的话就是[中右左]反过来,return res[::-1]
  •  Morris遍历

    • 过程看官解的动图
    • cur无左孩子,说明到最左端:
      • 加入结果,cur右移
    • cur有左孩子,说明有前驱,找前驱
      • 前驱无右孩:生成链接、cur左移
      • 前驱有右孩:断开连接,记录cur结果,cur右移
    • class Solution:
          def inorderTraversal(self, root: TreeNode) -> List[int]:
              res = []
              cur, prev = root, None
              while cur:
                  if not cur.left:  # 无左孩,到最左端
                      res.append(cur.val)  # 将当前节点cur的值加入结果列表
                      cur = cur.right  # 将当前节点指向右子树
                  else:
                      prev = cur.left  # 找到当前节点cur的左子树的最右节点(前驱)
                      while prev.right and prev.right != cur:
                          prev = prev.right
                      if not prev.right:  # 前驱无右孩
                          prev.right = cur  # 添加连接
                          # res.append(cur.val)  # 如果是前序,下面的加入结果改到这
                          cur = cur.left  # 左移
                      else:  # 前驱有右孩
                          prev.right = None  # 断开连接
                          res.append(cur.val)  # 将当前节点cur的值加入结果列表
                          cur = cur.right  # 右移
              return res
  •  标记迭代

    • class Solution:
          def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
              res = []
              stack = [(0, root)]  # 0表示当前未访问,1表示已访问
              while stack:
                  flag, cur = stack.pop()
                  if not cur: continue
                  if flag == 0:
                      stack.append((0, cur.right))  # 右
                      stack.append((1, cur))        # 中
                      stack.append((0, cur.left))   # 左
                  else:
                      res.append(cur.val)
              return res
      

二叉树所有遍历模板总结

144. 二叉树的前序遍历 - 力扣(LeetCode)

145. 二叉树的后序遍历 - 力扣(LeetCode)

102. 二叉树的层序遍历 - 力扣(LeetCode)

  • 两个列表

    • class Solution:
          def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
              if not root:
                  return []
              cur, res = [root], []  # cur表示当前层未访问结点,res为结果
              while cur:
                  lay, layval = [], []  # lay表示下一层该访问结点,layval表示当前层的数值列表
                  for node in cur:  # 遍历当前层所有结点
                      layval.append(node.val)
                      if node.left: lay.append(node.left)     # 添加左结点到下一层
                      if node.right: lay.append(node.right)   # 添加右结点到下一层
                  cur = lay  # 更新下一层
                  res.append(layval)  # 更新结果集
              return res
  • 队列BFS

    • """
      # BFS模板
      while queue 不空:
          cur = queue.pop()
          for 节点 in cur的所有相邻节点:
              if 该节点有效且未访问过:
                  queue.push(该节点)
      """
      class Solution:
          def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
              if not root:
                  return []
              res = []  # 结果
              q = deque()  # 队列
              q.append(root)
              # q = deque([root])  # 直接赋值需要传入可迭代对象[]
              while q:
                  vals = []  # 存当前层的值
                  for i in range(len(q)):  # 遍历队列中(当前层)所有结点
                      cur = q.popleft()
                      vals.append(cur.val)
                      if cur.left: q.append(cur.left)
                      if cur.right: q.append(cur.right)
                  res.append(vals)
              return res
  •  DFS递归

    • class Solution:
          def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
              res = []
              self.level(root, 0, res)
              return res
      
          def level(self, root: Optional[TreeNode], level: int, res: List[List[int]]):
              if not root: return
              if len(res) == level: res.append([])  # 一直向左遍历,新增层数对应的结果列表
              res[level].append(root.val)  # 当前结点加入当前层的结果里去
              if root.left: self.level(root.left, level+1, res)   # 递归遍历左子树
              if root.right: self.level(root.right, level+1, res) # 递归遍历右子树

589. N 叉树的前序遍历 - 力扣(LeetCode)

  • 递归

    • # 简单递归
      class Solution:
          def preorder(self, root: 'Node') -> List[int]:
              if not root: return
              temp = []
              for child in root.children:
                  temp += self.preorder(child)
              return [root.val] + temp
      # 常规递归
      class Solution:
          def preorder(self, root: 'Node') -> List[int]:
              res = []
              def dfs(cur):
                  if not cur: return
                  res.append(cur.val)
                  for child in cur.children:  # 遍历每一个子结点
                      dfs(child)
              dfs(root)
              return res
  • 迭代

    • class Solution:
          def preorder(self, root: 'Node') -> List[int]:
              if not root: return
              res = []
              s = [root]
              while s:
                  cur = s.pop()
                  res.append(cur.val)
                  for child in cur.children[::-1]:  # 从右往左添加进栈
                      s.append(child)
                  # s.extend(cur.children[::-1])  # 也可以直接拼接
              return res
      

590. N 叉树的后序遍历 - 力扣(LeetCode)

后言

  • 今天把以上几个二叉树遍历的题目模板刷熟!这样后面的题才能信手拈来~

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

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

相关文章

DBAPI如何使用数组类型参数

DBAPI如何使用数组类型参数 需求 根据多个id去查询学生信息 API创建 在基本信息标签&#xff0c;创建参数ids &#xff0c;参数类型选择 Array<bigint> 在执行器标签&#xff0c;填写sql&#xff0c;使用in查询 select * from student where id in <foreach ope…

多种方法合并Python中的两个列表、字典

直接看例子 两个字典的合并&#xff1a;已知字典 a{a: 1, b: 2, c: 3} 和 b{d: 4, e: 5, f: 6} 合并方法1&#xff1a; dict(a, **b) 操作如下&#xff1a; >>> a{a:1,b:2,c:3} >>> b{d:4,e:5,f:6} >>> dict(a,**b) {a: 1, b: 2, c: 3, d: 4, e:…

ETA1061V50S2G 输出5V 钰泰 同步升压转换器 1MHZ

描述 ETA1061是一种高效率的同步升压转换器&#xff0c;具有超低静态电流小于1μA。如果从低电压源提供至少2W的功率&#xff0c;即在5V输出时提供0.4A的功率它还具有一个真正的切断功能&#xff0c;从输出断开输入&#xff0c;在关机和输出短路条件。这消除了对外部MOSFET及其…

【JavaEE Spring 项目】在线 OJ 系统

在线OJ系统 1. 需求2. 最终页面展示3. 需求分析4. 创建 Spring 项目5. 前后端交互接口约定6. 后端功能实现6.1 编译运行模块6.1.1 进程和线程的相关知识6.1.2 Java 中的多进程编程6.1.3 进程间通信 -- 文件6.1.4 Java中的 IO 知识6.1.5 封装创建进程执行命令工具类6.1.6 实现编…

35.搜索插入位置+825.山脉数组的峰顶索引(二分查找的应用)

一、搜索插入位置 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int searchInsert(vector<int>& nums, int target) {int left 0;int right nums.size()-1;int mid (leftright)/2;while(left<right){if(nums[mid]<target){left mid1…

Selenium浏览器自动化测试框架详解

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google C…

杰发科技AC7801——SRAM 错误检测纠正

0.概述 7801暂时无错误注入&#xff0c;无法直接进中断看错误情况&#xff0c;具体效果后续看7840的带错误注入的测试情况。 1.简介 2.特性 3.功能 4.调试 可以看到在库文件里面有ecc_sram的库。 在官方GPIO代码里面写了点测试代码 成功打开2bit中断 因为没有错误注入&#x…

猫头虎分享已解决Bug || 服务器过热(Server Overheating):OverheatingWarning, ThermalShutdown

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

文心一言4.0 VS ChatGPT4.0 图片生成能力大比拼!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

基于Tomcat+MySQL+JAVA开发的酒店管理信息系统(无须Eclipse直接可在Tomcat中运行)

基于TomcatMySQLJAVA开发的酒店管理信息系统 项目介绍&#x1f481;&#x1f3fb; 介绍思路 1 《酒店管理系统》 资源目录介绍 2 安装配置 1&#xff09;前期准备 a、安装好MySQL数据库&#xff0c;用户名root&#xff0c;密码root b、安装配置java环境&#xff08;JDK1.7&…

AR汽车行业解决方案系列之2-远程汽修

在汽车行业中&#xff0c;AR技术的应用正悄然改变着整个产业链的运作方式&#xff0c;应用涵盖培训、汽修、汽车售后、PDI交付、质检以及汽车装配等&#xff0c;AR技术为多个环节都带来了前所未有的便利与效率提升。 安宝特AR将以系列推文的形式为读者逐一介绍在汽车行业中安宝…

企业微信应用开发:使用Cpolar域名配置进行本地接口回调的调试指南

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…

【SpringCloudAlibaba系列--nacos配置中心】

Nacos做注册中心以及使用docker部署nacos集群的博客在这&#xff1a; 容器化部署Nacos&#xff1a;从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入&#xff0c;引入…

springboot213大学生心理健康管理系统的设计与实现

大学生心理健康管理系统的设计与实现 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;试卷信息因为其管理内容繁杂&#xff0c;管理…

2024生物发酵创新-业栋阀门管件

参展企业介绍 温州业栋阀门管件有限公司是不锈钢阀门管件、不锈钢三通、U型管、弯头、大小头、球阀、蝶阀、卡箍、管子架及非标管件等产品专业生产加工的公司&#xff0c;拥有完整、科学的质量管理体系。公司坐落于十大具活力城市——温州&#xff0c;这里地杰人灵&#xff0c;…

Redis 事务机制之ACID属性

事务属性 事务是对数据库进行读写的一系列操作。在事务执行时提供ACID属性保证&#xff1a; 包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;…

什么是nginx 、安装nginx、nginx调优

一、 什么是nginx 1.1 nginx的概念 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 1.2 nginx模块与作用 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错…

nginx搭建直播rtmp推流,httpflv拉流环境

背景 工作中发现挺多直播CDN在实现httpflv拉流时都没有使用http chunk编码&#xff0c;而是直接使用no-content-length的做法。所以想自己搭建一个直播CDN支持 http chunk编码。 环境搭建 系统环境 Ubuntu 18.04.4 LTS 软件 nginx-1.18.0 nginx扩展模块 nginx-http-flv-mo…

数据湖Iceberg、Hudi和Paimon比较

1.社区发展现状 项目Apache IcebergApache HudiApache Paimon开源时间2018/11/62019/1/172023/3/12LicenseApache-2.0Apache-2.0Apache-2.0Github Watch1481.2k70Github Star5.3k4.9k 1.7k Github Fork1.9k2.3k702Github issue(Open)898481263Github issue(closed)20542410488…

使用yolo-seg模型实现自定义自动动态抠图

yolov8导航 如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接&#xff0c;我这边整理了许多其他任务的说明博文&#xff0c;后续也会持续更新&#xff0c;包括yolov8模型优化、sam等等的相关内容。 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; …