【力扣hot100】刷题笔记Day11

前言

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

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)

后言

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT/GPT4科研应用与AI绘图及论文写作

2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

第十一天-Excel的操作

目录 1.xlrd-Excel的读模块 安装 使用 获取工作簿 读取工作簿的内容 xlsxwriter-Excel的写模块 安装 使用 生成图表 add_series参数 图表的样式 demo:生成图表 Excel的操作在python中有多个模块,为了能够快速使用,选择了相对简单…

MATLAB使用绘图plot制作动态GIF

文章目录 1 前言2 DemoDemo 1 - 不使用函数Demo 2 - 使用函数 1 前言 在PPT展示或者博客创作中,有时需要插入动态图如GIF,来演示算法效果或者结果。在MATLAB中,可以通过一些代码,将绘图plot转化为动态的GIF。 其大致方法为&…

C++中的STL数据结构

内容来自:代码随想录:哈希表理论基础 1.常见的三种哈希结构 当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构 数组 set (集合) map(映射) 在C中,set 和 map 分别提供以下三种数据结构…

vue3的diff

以vue3的patch为例 首先判断两个节点是否为相同同类节点,不同则删除重新创建如果双方都是文本则更新文本内容如果双方都是元素节点则递归更新子元素,同时更新元素属性更新子节点时又分了几种情况 新的子节点是文本,老的子节点是数组则清空&a…

07 STL 简介

目录 什么是STLSTL的版本STL的六大组件STL的重要性如何学习STLSTL的缺陷 1. 什么是STL c标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构和算法的软件框架 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee在惠普实验室的…

详解AP3216C(三合一sensor: 光照、距离、照射强度)驱动开发

目录 概述 1 认识AP3216C 1.1 AP3216C特性 1.2 AP3216C内部结构 1.3 AP3216C 硬件电路 1.4 AP3216C工作时序 1.4.1 I2C 写数据协议 1.4.2 I2C 读数据协议 1.5 重要的寄存器 1.5.1 系统配置寄存器 1.5.2 和中断相关寄存器 1.5.3 IR数据寄存器 1.5.4 ALS 数据寄存器 …

Android 开发一个耳返程序(录音,实时播放)

本文目录 点击直达 Android 开发一个耳返程序程序编写1. 配置 AndroidManifast.xml2.编写耳返管理器3. 录音权限申请4. 使用注意 最后我还有一句话要说怕相思,已相思,轮到相思没处辞,眉间露一丝 Android 开发一个耳返程序 耳返程序是声音录入…

计算机网络实验八 利用 Java /C++开发网络聊天应用程序

一、实验目的和要求 1)基本掌握利用 Java 开发环境调试应用程序的方法。 2)理解基于套接字开发网络应用程序的过程,深入理解客户/服务器方式工作原理。 3)掌握基于Java和C++开发网络通信程序的方法。 二、实验环境 1)运行 Windows 2008 Server/XP/7 操作系统的 PC 2 台…

应急响应实战笔记03权限维持篇(3)

0x00 前言 攻击者在获取服务器权限后,会通过一些技巧来隐藏自己的踪迹和后门文件,本文介绍Linux下的几种隐藏技术。 0x01 隐藏文件 Linux 下创建一个隐藏文件:touch .test.txt touch 命令可以创建一个文件,文件名前面加一个 点…

一文读懂:AWS 网络对等互连(VPC peering)实用操作指南

VPC peering connection-网络对等互连在您的 Atlas VPC 和云提供商的 VPC 之间建立私有连接。该连接将流量与公共网络隔离以提高安全性。本篇文章有VPC peering的操作指南以及价格等信息。如还有疑问请联系我们MongoDB的销售,客户成功经理或解决方案架构师。 1 使用…

开源大语言模型作为 LangChain 智能体

概要 开源大型语言模型 (LLMs) 现已达到一种性能水平,使它们适合作为推动智能体工作流的推理引擎: Mixtral 甚至在我们的基准测试中 超过了 GPT-3.5,并且通过微调,其性能可以轻易的得到进一步增强。 引言 针对 因果语言建模 训练的大型语言模…

用买糖果的方式来理解正交匹配追踪(OMP)算法

在信号处理领域,压缩感知(Compressed Sensing)是一种能够从远少于传统奈奎斯特采样定理所要求的样本数目中重建稀疏信号的技术。压缩感知的理论基础在于一个前提假设,即许多自然信号都含有稀疏的表示,换句话说&#xf…

【Python】OpenCV-图像轮廓检测初学

图像轮廓检测初学 在图像处理领域中,轮廓检测是一项重要的任务,用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测,并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。 1. 引言 图像轮廓检测是图…

决策树算法

目录 谷歌笔记本(可选) 决策树 决策树的一般流程 信息增益 划分数据集 递归构建决策树 使用Matplotlib注解绘制树形图 Matplotlib注解 构造注解树 测试和存储分类器 测试算法:使用决策树执行分类 使用算法:决策树的存…

RISC-V知识总结 —— 指令集

资源1: RISC-V China – RISC-V International 资源2: RISC-V International – RISC-V: The Open Standard RISC Instruction Set Architecture 资源3: RV32I, RV64I Instructions — riscv-isa-pages documentation 1. 指令集架构的类型 在讨论RISC-V或任何处理器架构时&…

基于springboot+vue的图书进销存管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【Vue3】学习computed计算属性

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

华清远见嵌入式学习——驱动开发——day9

目录 作业要求: 作业答案: 代码效果: ​编辑 Platform总线驱动代码: 应用程序代码: 设备树配置: 作业要求: 通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试&…

JAVA代码审计之XSS漏洞

Part1 漏洞案例demo&#xff1a; 没有java代码审计XSS漏洞拿赏金的案例。 所以将就看看demo吧 漏洞原理&#xff1a;关于XSS漏洞的漏洞原理核心其实没啥好说的&#xff0c;网上一查一大堆 反射性XSS漏洞 <% page language"java" contentType"text/html; c…