【数据结构】树的遍历

树的遍历

前序遍历

前序遍历是按照根节点->左子树->右子树的顺序进行遍历
在这里插入图片描述

图片来源维基百科深度优先遍历(前序遍历): F, B, A, D, C, E, G, I, H.

代码实现
递归
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# @param root TreeNode类 
# @return int整型一维数组
class Solution:def preorderTraversal(self , root: TreeNode) -> List[int]:# write code hereif not root:return []return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
非递归
class Solution:def preorderTraversal(self , root: TreeNode) -> List[int]:# write code hereif not root:return []node_stack = []ans = []node_stack.append(root)while node_stack:node = node_stack.pop(-1)if node.right:node_stack.append(node.right)if node.left:node_stack.append(node.left)ans.append(node.val)return ans

牛客 BM23 二叉树的前序遍历

中序遍历

中序遍历是按照左子树->根节点->右子树的顺序进行遍历

在这里插入图片描述

图片来源维基百科深度优先遍历(中序遍历): A, B, C, D, E, F, G, H, I.

代码实现
递归
class Solution:def inorderTraversal(self , root: TreeNode) -> List[int]:# write code hereif not root:return []return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
非递归
class Solution:def inorderTraversal(self , root: TreeNode) -> List[int]:# write code hereif not root:return []node_stack = []ans = []while node_stack or root:while root:node_stack.append(root)root = root.leftnode = node_stack.pop(-1)ans.append(node.val)root = node.rightreturn ans

牛客 BM24 二叉树的中序遍历

后序遍历

中序遍历是按照左子树->右子树->根节点的顺序进行遍历

在这里插入图片描述

图片来源维基百科深度优先搜索(后序遍历):A, C, E, D, B, H, I, G, F.

代码实现
递归
class Solution:def postorderTraversal(self , root: TreeNode) -> List[int]:# write code hereif not root:return []return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]
非递归
class Solution:def postorderTraversal(self , root: TreeNode) -> List[int]:# write code hereif not root:return []pre = Nonenode_stack = []ans = []while root or node_stack:# 每次先找到最左边的节点while root:node_stack.append(root)root = root.leftnode = node_stack.pop(-1)# 如果该元素的右边没有或是已经访问过if not node.right or node.right is pre:ans.append(node.val)pre = nodeelse:node_stack.append(node)root = node.rightreturn ans

层次遍历

层次遍历是按照从上往下、从左往右一层层进行遍历

在这里插入图片描述

图片来源维基百科广度优先遍历 - 层次遍历:F, B, G, A, D, I, C, E, H.

方法
  1. 判断二叉树是否为空,空树返回空列表。
  2. 建立辅助队列,根节点入队。
  3. 每次进入一层,统计队列中元素的个数。因为每当访问完一层,下一层作为这一层的子节点,一定都加入队列,而再下一层还没有加入,因此此时队列中的元素个数就是这一层的元素个数。
  4. 每次遍历一层对应元素数量的节点,将其依次从队列中弹出,数值加入该层结果列表,若存在子节点,依次加入队列排队等待访问。
  5. 访问完这一层的元素后,将这个一维数组加入二维数组中,再访问下一层。
代码实现
class Solution:def levelOrder(self , root: TreeNode) -> List[List[int]]:# write code hereif not root:return []node_queue = []ans = []node_queue.append(root)while node_queue:ans_row = []n = len(node_queue)for i in range(n):node = node_queue.pop(0)ans_row.append(node.val)if node.left:node_queue.append(node.left)if node.right:node_queue.append(node.right)ans.append(ans_row)return ans

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

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

相关文章

RFID标签在汽车监管方面的应用与实施方案

RFID技术在汽车工业领域得到了广泛应用,主要体现在汽车资质证书远程监管系统的普及化,系统包括OBD接口监视器、车证监管箱、超高频读写设备、应用系统软件以及大数据采集与处理等组成部分。 在汽车物流监管方面,系统利用OBD接口监控车辆并实时…

idea中使用Lombok 失效,@Slf4j 找不到符号的解决办法

文章目录 一、前言二、问题排查和解决方案三、 其他解决方案3.1 另一种解决方案3.2 参考文章 一、前言 今天在一个多module工程中,新增了一个 springboot(版本 2.2.4.RELEASE) module,像往常一样,我引入了lombok依赖&…

Nacos 持久化及集群的搭建【微服务】

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务,管理起来非常简单,但…

数据采集有哪些方法?HTTP代理起到什么作用?

在这个数字化的时代,数据就如同生活中不可或缺的元素,我们的行为、喜好、甚至是想法都被转化成了数字化的信息。那么,现代社会是如何进行数据的采集的呢?让我们一同来看看! 1. 网络浏览行为的追踪 在我们浏览互联网的…

如何从 Android手机存储卡中恢复已删除的文件

作为 Android 用户,您可能会使用 存储卡来扩展手机的存储容量,并存储照片、视频和其他类型的文件。但意外发生时,您可能会错误地删除其中一些文件,或者由于其他原因而丢失它们。在大多数情况下,您可以通过主动并遵循正…

【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之Spring定义Jackson转换Null的方法和实现案例

Spring自动定义Jackson转换Null得方法 背景MessageConverter 使用Jackson原生方式处理空字段(次重点方案)ObjectMapper的配置选项通过使用注解的方式 MappingJackson2HttpMessageConverter(重点方案)创建MappingJackson2HttpMessa…

vue3+echart绘制中国地图并根据后端返回的坐标实现涟漪动画效果

1.效果图 2.前期准备 main.js app.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M6tDCApL,// v:3.0, // 默认使用3.0// type: WebGL // ||API 默认API (使用此模式 BMapBMapGL) });i…

vue3 实现el-date-picker日期筛选过程

一、图例 二、需求&#xff1a; 有2个查询条件&#xff0c;startTime 和 endTime 选中时间1&#xff0c;禁止选中时间2&#xff0c;当前值传递给 startTime 选中时间2&#xff0c;禁止选中时间1&#xff0c;当前值传递给 startTime 和 endTime 三、完整代码 <div class…

无心剑七绝《译无止境》

七绝译无止境 人生跌宕几春秋 苦辣酸甜永不休 只待通灵成妙译 神思曼舞醉琼楼 2024年1月6日 平水韵十一尤平韵 无心剑的这首《译无止境》以七言绝句的形式&#xff0c;表达了对翻译事业的热爱和追求。 首句“人生跌宕几春秋”&#xff0c;意味着人生的曲折变化&#xff0c…

K8S部署GitLab

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Jmeter相关知识介绍

Jmeter 是Apache 组织开发的基于JAVA 的压力测试工具,用于对软件做压力测试,特别适合于WEB 应用测试(包括压力,接口测试) 今天简单介绍Jemeter的入门相关概念的理解 一、在安装目录下有一个Bin\Jmeter.bat 双击打开 打开之后是一个这样的界面 二、测试计划 1、添加和删…

【Python机器学习】线性模型——lasso

除了岭回归&#xff0c;还有一种正则化的线性回归是lasso&#xff0c;与岭回归相同&#xff0c;使用lasso也是约束系数使其接近于0&#xff0c;但方法不同&#xff0c;叫做L1正则化。L1正则化的结果是使用lasso时某些系数刚好为0。说明某些特征被模型完全忽略。 同样以波士顿房…