【力扣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  # 后序改成leftreturn res  # 后序的话就是[中右左]反过来,return res[::-1]
  •  Morris遍历

    • 过程看官解的动图
    • cur无左孩子,说明到最左端:
      • 加入结果,cur右移
    • cur有左孩子,说明有前驱,找前驱
      • 前驱无右孩:生成链接、cur左移
      • 前驱有右孩:断开连接,记录cur结果,cur右移
    • class Solution:def inorderTraversal(self, root: TreeNode) -> List[int]:res = []cur, prev = root, Nonewhile 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.rightif 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: continueif 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 resdef level(self, root: Optional[TreeNode], level: int, res: List[List[int]]):if not root: returnif 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: returntemp = []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: returnres.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: returnres = []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.hqwc.cn/news/487780.html

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

相关文章

基于ssm框架的高校班级管理系统设计与实现

为解决当前高校班级管理中管理方式落后、手段落后及效率低下等问题而以当前主流的互联网技术设计一款高校班级管理系统。该系统采用B/S模式的设计思路而将前端(JSP技术)和后端(SSM框架MySQL数据库)整合于一体并通过Java语言代码编…

华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)---Python3--开源

题目: 考察内容: for if max 代码: """ 题目分析:投资额*回报率投资回报 要在可接受范围内选择最优的投资方式获得最大回报最多投资2个理财产品输入: 产品数int; 总投资额int; 总风险int 产品投资…

Phind-70B-运行速度提高4倍的同时,缩小了与GPT-4 Turbo在代码质量上的差距

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

129 Linux 系统编程8 IO操作 系统函数 open

系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。是应用程序同系统之间数据交互的桥梁。 C标准函数和系统函数调用关系。一个helloworld如何打印到屏幕。 回忆我们前面学过的C标准…

使用 yarn 的时候,遇到 Error [ERR_REQUIRE_ESM]: require() of ES Module 怎么解决?

晚上回到家,我打开自己的项目,执行: cd HexoPress git pull --rebase yarn install yarn dev拉取在公司 push 的代码,然后更新依赖,最后开始今晚的开发时候,意外发生了,竟然报错了,…

基于qt的图书管理系统----03核心界面设计

参考b站:视频连接 源码github:github 目录 1 添加软件图标2 打包程序3 三个管理界面设计4 代码编写4.1 加载界面4.2 点击按钮切换界面4.3 组团添加样式4.4 搭建表头4.5 表格相关操作 从别人那里下载的项目会有这个文件,里边是别人配置的路径…

基于Java SSM框架实现艺诚美业管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现艺诚美业管理系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识&a…

制造执行系统(MOM):生产过程大屏联动、一目了然。

大家好,我是大美B端工场,本期继续分享常见的制作执行系统,欢迎大家关注,如有B端写系统界面的设计和前端需求,可以联络我们。 一、什么是MOM MOM系统是制造执行系统(Manufacturing Operations Management S…

IDEA Debug框的 show execution point按钮没了

在这里右键: Add Action: 搜索添加: 本文由博客一文多发平台 OpenWrite 发布!

go 1.18 不同目录package引用问题

go 1.18开始使用module了 不同的package在vs code中引用的话 需要先开启 是Go1.11版本之后 推出的版本管理工具 有点类似java的 maven工具 可以引入依赖使用 go env -w GO111MODULEon 先把这个打开 然后在创建的vs code工作目录下 执行 module gomdoule module 模块名 会生…

Linux——简单的Shell程序

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、Shell程序思路二、Shell代码展示 一、Shell程序思路 用下图的时间轴来表示事件的发生次序…

Moment.js——轻松处理日期和和时间,有实例代码

hello,我是贝格前端工场,本期给大家带来便捷的处理日期和时间的js库:Moment.js,用这个类库处理时间将会十分方便,欢迎老铁们点赞关注,如有前端定制开发需求可以私信我们。 一、Moment.js的简介和功能 Mom…