代码随想录算法训练营第13天|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法、102.二叉树的层序遍历

打卡Day13

  • 1.理论基础
  • 2.二叉树的递归遍历
  • 3.二叉树的迭代遍历
  • 3.二叉树的统一迭代法
  • 4.102.二叉树的层序遍历
    • 扩展
      • 107. 二叉树的层序遍历 II
      • 199.二叉树的右视图
      • 637.二叉树的层平均值
      • 429.N叉树的层序遍历
      • 515.在每个树行中找最大值
      • 116.填充每个节点的下一个右侧节点指针
      • 117. 填充每个节点的下一个右侧节点指针 II
      • 104. 二叉树的最大深度
      • #111.二叉树的最小深度

1.理论基础

文档讲解: 代码随想录

解题过程二叉树有两种主要形式:满二叉树和完全二叉树。
(1)满二叉树:一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上。深度为 k 的满二叉树有 2^k - 1 个节点。

在这里插入图片描述
(2)完全二叉树:除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面的节点都集中在该层最左边的若干位置。若最底层为第 h(h >= 1) 层,则该层包含 1 ~ 2^(h -1) 。

在这里插入图片描述
之前优先级队列其实是一个堆,堆是一颗完全二叉树,同时保证父子节点的顺序关系。

二叉搜索树:是一个有序树。
平衡二叉搜索树:是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

二叉树的定义:


class TreeNode:def __init__(self, val, left = None, right = None):self.val = valself.left = leftself.right = right

2.二叉树的递归遍历

文档讲解: 代码随想录

递归算法的三要素:
(1)确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
(2)确定终止条件:如果递归没有终止,操作系统的内存站必然会溢出。运行递归算法遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对。
(3)确定单层递归的逻辑:确定每一层递归需要处理的信息,在这里也就会重复调用自己来实现递归的过程。

以前序遍历为例:
(1)确定递归函数的参数和返回值:参数为当前树节点,返回值为空。我本来以为需要返回节点的数据,但在函数的内部直接将数据加入到列表中。
(2)终止条件:当遍历的节点为空,直接return。
(3)确定单层递归的逻辑:先取中节点的数值,再取左节点,最后右节点。

题目链接:前序遍历

class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res = []def dfs(node):if node is None:returnres.append(node.val)dfs(node.left)dfs(node.right)dfs(root)return res       

题目链接:后序遍历

class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res = []def dfs(node):if node is None:returndfs(node.left)dfs(node.right)res.append(node.val)dfs(root)return res

题目链接:中序遍历

class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res = []def dfs(node):if node is None:return dfs(node.left)res.append(node.val)dfs(node.right)dfs(root)return res

3.二叉树的迭代遍历

文档讲解: 代码随想录

题目链接:前序遍历

class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []#跟节点先入栈stack = [root]res = []while stack:node = stack.pop()#处理中节点res.append(node.val)#右孩子先入栈if node.right:stack.append(node.right)#左孩子入栈if node.left:stack.append(node.left)return res

题目链接:后序遍历

class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []stack = [root]res = []while stack:node = stack.pop()res.append(node.val)if node.left:stack.append(node.left)if node.right:stack.append(node.right)return res[::-1]

题目链接:中序遍历

在中序遍历中,处理元素和访问元素的顺序不一致,需要借助指针的遍历来帮助访问节点,栈用来处理节点上的元素。不能提前将根节点放入栈中,如果先放入的话,迭代处理会先访问跟节点,而不是最左边的叶子节点。

class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []res = []stack = []cur = rootwhile cur or stack:#先迭代访问最左边的叶子节点if cur:stack.append(cur)cur = cur.leftelse:#此时cur = nullcur = stack.pop()res.append(cur.val)cur = cur.rightreturn res 

3.二叉树的统一迭代法

文档讲解: 代码随想录

题目链接:前序遍历

class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res = []stack = []if root:stack.append(root)while stack:node = stack.pop()if node != None:if node.right:stack.append(node.right)if node.left:stack.append(node.left)stack.append(node)stack.append(None)else:node = stack.pop()res.append(node.val)return res

题目链接:后序遍历

class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res = []stack = []if root:stack.append(root)while stack:node = stack.pop()if node != None:stack.append(node)stack.append(None)if node.left:stack.append(node.left)if node.right:stack.append(node.right)else:node = stack.pop()res.append(node.val)return res

题目链接:中序遍历

class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res = []stack = []if root:stack.append(root)while stack:node = stack.pop()if node != None:if node.right:stack.append(node.right)stack.append(node)stack.append(None)if node.left:stack.append(node.left)else:node = stack.pop()res.append(node.val)return res

4.102.二叉树的层序遍历

题目链接:102.二叉树的层序遍历
文档讲解: 代码随想录

class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if not root:return []queue = collections.deque([root])res = []while queue:level = []for i in range(len(queue)):cur = queue.popleft()level.append(cur.val)if cur.left:queue.append(cur.left)if cur.right:queue.append(cur.right)res.append(level)return res

递归法:

class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if not root:return []levels = []def traverse(node, level):if not node:returnif len(levels) == level:levels.append([])levels[level].append(node.val)traverse(node.left, level + 1)traverse(node.right, level + 1)traverse(root, 0)return levels

扩展

107. 二叉树的层序遍历 II

题目链接:107

思路:在上题的基础上,输出的时候反转一下顺序。

class Solution(object):def levelOrderBottom(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if not root:return []res = []queue = collections.deque([root])while queue:level = []for i in range(len(queue)):node = queue.popleft()level.append(node.val)if node.left:queue.append(node.left)if node.right:queue.append(node.right)res.append(level)return res[::-1]

199.二叉树的右视图

题目链接:199

一开始题目没有理解好,以为是将每层元素从右往左组成列表输出。题目要求的是只输出每层最右边元素组成的一维列表。

class Solution(object):def rightSideView(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []res = []queue = collections.deque([root])while queue:#需要用变量存储长度,因为下面会对队列进行操作size = len(queue)for i in range(size):node = queue.popleft()if i == size - 1:res.append(node.val)if node.left:queue.append(node.left)if node.right:queue.append(node.right)return res

637.二叉树的层平均值

题目链接:637

class Solution(object):def averageOfLevels(self, root):""":type root: TreeNode:rtype: List[float]"""if not root:return []queue = collections.deque([root])res = []while queue:summ = 0size = len(queue)for i in range(size):node = queue.popleft()summ += node.valif node.left:queue.append(node.left)if node.right:queue.append(node.right)res.append(round(summ / size, 4))return res    

出现的问题:
在这里插入图片描述

将自己的代码替换到python3中是可行的,感觉是数据类型有点问题,具体是什么问题不能确认,暂时没有解决。

429.N叉树的层序遍历

题目链接:429

class Solution(object):def levelOrder(self, root):""":type root: Node:rtype: List[List[int]]"""if not root:return []res = []queue = collections.deque([root])while queue:level = []size = len(queue)for i in range(size):node = queue.popleft()level.append(node.val)#用for循环遍历孩子节点for child in node.children:queue.append(child)res.append(level)return res 

515.在每个树行中找最大值

题目链接:515

class Solution(object):def largestValues(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []queue = collections.deque([root])res = []while queue:size = len(queue)maxx = queue[0].val#可以使用maxx = float('-inf')初始化for i in range(size):node = queue.popleft()if node.val > maxx:maxx = node.valif node.left:queue.append(node.left)if node.right:queue.append(node.right)res.append(maxx)return res     

116.填充每个节点的下一个右侧节点指针

题目链接:116

class Solution(object):def connect(self, root):""":type root: Node:rtype: Node"""if not root:return rootqueue = collections.deque([root])while queue:size = len(queue)pre = Nonefor i in range(size):node = queue.popleft()if pre:pre.next = nodepre = nodeif node.left:queue.append(node.left)if node.right:queue.append(node.right)return root

117. 填充每个节点的下一个右侧节点指针 II

题目链接:117

class Solution(object):def connect(self, root):""":type root: Node:rtype: Node"""if not root:return rootqueue = collections.deque([root])while queue:size = len(queue)pre = None for i in range(size):node = queue.popleft()if pre:pre.next = nodepre = nodeif node.left:queue.append(node.left)if node.right:queue.append(node.right)return root

104. 二叉树的最大深度

题目链接:104

class Solution(object):def maxDepth(self, root):""":type root: TreeNode:rtype: int"""if not root:return 0queue = collections.deque([root])deep = 0while queue:size = len(queue)deep += 1for i in range(size):node = queue.popleft()if node.left:queue.append(node.left)if node.right:queue.append(node.right)return deep

#111.二叉树的最小深度

题目链接:111

class Solution(object):def minDepth(self, root):""":type root: TreeNode:rtype: int"""if not root:return 0deep = 0queue = collections.deque([root])while queue:size = len(queue)deep += 1for i in range(size):node = queue.popleft()if not node.left and not node.right:return deepif node.left:queue.append(node.left)if node.right:queue.append(node.right)return deep

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

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

相关文章

如何保证接口幂等性

如何保证接口幂等性 1、幂等性是什么? 接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了不同的结果。 2、使用幂等性的场景有哪些? 页面点击保存按钮时,不小心快速点了两次…

上万组风电,光伏,用户负荷数据分享

上万组风电,光伏,用户负荷数据分享 可用于风光负荷预测等研究 获取链接🔗 https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取码:381i 获取链接🔗 https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…

一行代码用git新建分支

1.在本地创建分支 dev git branch dev2.切换分支 git checkout devwebstorm操作如下: 3.推送新分支到远程 git push --set-upstream origin 分支名webstorm操作如下:提交代码的时候会自动推送到远程 4.到git上面可以看看刚刚推送的内容 dev多推送…

Proxmox VE 8虚拟机直通USB磁盘

作者:田逸(fromyz) 今天有个兄弟发消息,咨询怎么让插在服务器上的U盾被Proxmox VE上的虚拟机识别。在很久很久以前,我尝试过在Proxmox VE 5以前的版本创建windows虚拟机,并把插在Proxmox VE宿主机上的银行U…

Android ViewPostImeInputStage输入事件处理

InputDispatcher向InputChannel使用socket写入输入事件,触发InputEventReceiver调用来接收输入事件。 ViewPostImeInputStage处理view控件的事件 frameworks/base/core/java/android/view/InputEventReceiver.java dispatchInputEvent frameworks/base/core/jav…

SwinTransformer的相对位置索引的原理以及源码分析

文章目录 1. 理论分析2. 完整代码 引用:参考博客链接 1. 理论分析 根据论文中提供的公式可知是在 Q Q Q和 K K K进行匹配并除以 d \sqrt d d ​ 后加上了相对位置偏执 B B B。 A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d B ) V \begin{aligned} &…

绝了,华为伸缩摄像头如何突破影像边界?

自华为Pura70 Ultra超聚光伸缩镜头诞生以来,备受大家的关注,听说这颗镜头打破了传统手机的摄像头体积与镜头的设计,为我们带来了不一样的拍照体验。 智能手机飞速发展的今天,影像功能已经成为我们衡量一款手机性能的重要指标。想…

MySQL中mycat与mha应用

目录 一.Mycat代理服务器 1.Mycat应用场景 2.mycat安装目录结构说明 3.Mycat的常用配置文件 4.Mycat日志 5.mycat 实现读写分离 二.MySQL高可用 1.原理过程 2.MHA软件 3.实现MHA 一.Mycat代理服务器 1.Mycat应用场景 Mycat适用的场景很丰富,以下是几个典型…

沪上繁花:上海电信的5G-A之跃

2024年6月18日下午,在上海举行的3GPP RAN第104次会议上,3GPP正式宣布R18标准冻结。R18是无线网络面向5G-A的第一个版本,其成功冻结正式宣布了5G发展迎来新机遇,5G-A商用已进入全新的发展阶段。 在5G-A滚滚而来的时代洪流中&#x…

C#实战|账号管理系统:通用登录窗体的实现。

哈喽,你好啊,我是雷工! 本节记录登录窗体的实现方法,比较有通用性,所有的项目登录窗体实现基本都是这个实现思路。 一通百通,以下为学习笔记。 01 登录窗体的逻辑 用户在登录窗输入账号和密码,如果输入账号和密码信息正确,点击【登录】按钮,则跳转显示主窗体,同时在固…

上海外贸建站公司wordpress模板推荐

Sora索啦高端制造业wordpress主题 红色高端制造业wordpress主题,适合外贸企业出海建独立站的wordpress模板。 https://www.jianzhanpress.com/?p5885 Yamal外贸独立站wordpress主题 绿色的亚马尔Yamal外贸独立站wordpress模板,适用于外贸公司建独立站…

Redis 中 Set 和 Zset 类型

目录 1.Set类型 1.1 Set集合 1.2 普通命令 1.3 集合操作 1.4 内部编码 1.5 使用场景 2.Zset类型 2.1 Zset有序集合 2.2 普通命令 2.3 集合间操作 2.4 内部编码 2.5 使用场景 1.Set类型 1.1 Set集合 集合类型也是保存多个字符串类型的元素,但是和列表类型不同的是&…

【Go】excelize库实现excel导入导出封装(四),导出时自定义某一列或多列的单元格样式

大家好,这里是符华~ 查看前三篇: 【Go】excelize库实现excel导入导出封装(一),自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头 【Go】excelize库实现excel导入导出封装(二&…

WY-35A4T三相电压继电器 导轨安装 约瑟JOSEF

功能简述 WY系列电压继电器是带延时功能的数字式交流电压继电器。 可用于发电机,变压器和输电线的继电保护装置中,作为过电压或欠电压闭锁的动作元件 LCD实时显示当前输入电压值 额定输入电压Un:100VAC、200VAC、400VAC产品满足电磁兼容四级标准 产品…

VBA初学:零件成本统计之一(任务汇总)

经过前期一年多对金蝶K3生产任务流程和操作的改造和优化,现在总算可以将零件加工各个环节的成本进行归集了。 原本想写存储过程,通过直接SQL报表做到K3中去的,但财务原本就是用EXCEL,可以方便调整和保存,加上还有一部分…

便携式气象站:探索自然的智慧伙伴

在探索自然奥秘、追求科学真理的道路上,气象数据始终是我们不可或缺的指引。然而,传统的气象站往往庞大而笨重,难以在偏远地区或移动环境中灵活部署。 便携式气象站,顾名思义,是一种小巧轻便、易于携带和安装的气象观测…

由于找不到xinput1 3.dll无法继续执行重新安装程序

如果您的计算机提示无法找到xinput1_3.dll文件,这可能表明您的计算机存在问题。在这种情况下,您需要立即对xinput1_3.dll文件进行修复,否则您的某些程序将无法启动。以下是解决无法找到xinput1_3.dll文件的方法。 一、关于xinput1_3.dll文件的…

Elasticsearch 实现 Word、PDF,TXT 文件的全文内容提取与检索

文章目录 一、安装软件:1.通过docker安装好Es、kibana安装kibana:2.安装原文检索与分词插件:之后我们可以通过doc命令查看下载的镜像以及运行的状态:二、创建管道pipeline名称为attachment二、创建索引映射:用于存放上传文件的信息三、SpringBoot整合对于原文检索1、导入依赖…

安全及应用(更新)

一、账号安全 1.1系统帐号清理 #查看/sbin/nologin结尾的文件并统计 [rootrootlocalhost ~]# grep /sbin/nologin$ /etc/passwd |wc -l 40#查看apache登录的shell [rootrootlocalhost ~]# grep apache /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin#改变…

Android增量更新----java版

一、背景 开发过程中,随着apk包越来越大,全量更新会使得耗时,同时浪费流量,为了节省时间,使用增量更新解决。网上很多文章都不是很清楚,没有手把手教学,使得很多初学者,摸不着头脑&a…