二叉树刷题记(二-中序遍历)

简介: 二叉树刷题记(二-中序遍历)

前言

  • 昨天做了一道二叉树的中序遍历题目, 采用递归方式完成,今天更新第二种方法,使用迭代方法完成本题。在面试的时候,面试让你手写非递归的代码可能性会大一点,因为递归就那么几行代码,看一眼就会了。


  • 什么是迭代呢?
  • 在我的认识里:迭代就是使用循环嵌套的方式,然后借助辅助空间,例如数组等其他数据结构。
  • 越是比较难写出来的代码,它的质量一般来说是比较高的


本文目的

  • 1.二叉树的中序遍历过程
  • 2.学会中序遍历的非递归代码,理解并掌握代码的实现过程
  • 3.希望本文章对你学习写代码有一定的帮助


预备知识1:

  • 二叉树中左孩子右孩子父结点代表的是什么?

预备知识2:

  • 中序遍历的顺序是什么呢?
  • 左孩子-》父结点-》右孩子
  • 上图的输出顺序为 [4,2,5,1,3,6]
  • 这个应该很好计算出来的,如果不会,欢迎下方评论区留言,我会专门讲解一下,也就当是给自己复习咯!


  • 啦啦啦,差不多了。当然你还得掌握循环和数组这些基本知识
  • 1.题目如下

  • 2.代码实现


代码思想:首先,我们得用一个栈来保存我们在循环过程中遇到的元素,遇到就把元素压栈。那么这里又有一个问题,我们不能只入栈而不出栈,那我们什么时候出栈呢?

我们知道,中序遍历是从左孩子开始的,所以我们应该是左孩子为null,也就是没有左孩子的时候出栈(这只是我的一种解释,不同人对这个解释不一样),知道这个这个问题就差不多了。

树这个数据结构,遇到该类型问题我的理解就是将问题转化成一个结点的问题,这个结点能处理好了,那么其他的也就大致差不多,而且我觉得树的问题有一定的规律可循,这个还是需要慢慢发现的。

直接看代码

var inorderTraversal = function(root) {
   let res  = [];//最后要返回的数组
   let stack = [];//我们用来存储遍历过程中遇到的元素
   //root == null 并且 stack.length == 0(循环退出)    
   while(root||stack.length){
        while(root){//当前元素存在就循环
           stack.push(root);//把当前元素入栈,不是入的值,而是当前的整个元素
           root = root.left;//继续找它的左孩子
        }
        //该元素没有左孩子,那么我们就应该打印该元素
        let target  = stack.pop();//返回该元素并出栈
        res.push(target.val);//将该元素的值压入要返回的栈里边
        root = target.right;//遍历该元素的右孩子,因为左边和中间(父结点)已经遍历过了
   }
   return res;//返回最终的结果
};

解释

外层循环的判断条件(root||stack.length)

循环退出的条件

root == null 并且 stack.length == 0

root == null的意思就是继续以该方向往下找已经找不到了,需要退回另走一个方向试试

stack.length == 0就是所有元素已经遇见并且都打印了

注:这里说的是root刚开始不是null它的过程

其他的重点我都写在代码那里了,若有那一部分解释有问题,欢迎提出。

结尾

  • 本人笔拙,有的地方写的可能不对,欢迎提出。
  • 希望文章对你有所帮助,若觉得还有点用,欢迎点赞支持。
相关文章
|
缓存 运维 Java
nacos常见问题之点击下线提示报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
629 2
|
Dubbo Cloud Native 网络协议
【Dubbo3技术专题】「服务架构体系」第一章之Dubbo3新特性要点之RPC协议分析介绍
【Dubbo3技术专题】「服务架构体系」第一章之Dubbo3新特性要点之RPC协议分析介绍
465 1
|
XML Java 数据格式
肝了30天总结,史上最全面透彻的Spring核心原理分析和27道高频面试题
在阅读面试题之前,小伙伴们可以先看看我之前发布的系列文章,Spring核心原理包括源码分析和用30个类手写。面试刷题固然很重要,但是知其然知其所以然更重要。
2216 4
肝了30天总结,史上最全面透彻的Spring核心原理分析和27道高频面试题
|
算法 程序员 应用服务中间件
推荐一款基于docker部署的个人免费笔记工具wiznote
推荐一款基于docker部署的个人免费笔记工具wiznote
推荐一款基于docker部署的个人免费笔记工具wiznote
|
API Apache 对象存储
数据编排的现代时代:从数据碎片化到协作
数据工程与软件工程长期存在分歧,各自拥有独特的工具和最佳实践。本文探讨了数据编排器的角色及其最新趋势,如何使这两个领域更加紧密地结合。数据编排通过协调数据的提取、转换和服务,解决了多数据源、目标和工具的复杂性。文中介绍了 ELT 流程、不同类型的编排工具(如 Apache Airflow 和 Apache Flink),以及未来可组合数据系统的开放标准,如 Apache Parquet 和 Apache Arrow。这些标准有助于简化数据共享和治理,推动数据系统的未来发展。
646 2
数据编排的现代时代:从数据碎片化到协作
|
人工智能 机器人 UED
数字人模型网页手机云推流语音交互
随着AI技术的发展,数字人与大型语言模型的结合迎来了新机遇,各类数字人服务不断涌现,应用于多种场景。点量小芹发现许多厂商仍在探索如何优化数字人在移动端的表现。通过云推流实时渲染解决方案。无论是直播中的数字人形象定制,还是网页客服与大屏讲解的应用,只需将数字人模型置于服务器端,借助云渲染技术,用户即可在网页或移动设备上轻松使用高精度的数字人,显著降低硬件需求,提升互动体验。
556 14
|
存储 人工智能 机器人
基于AI人工智能大模型下的物流运输业务场景搭建
党的二十大报告深刻阐述了我国物流运输发展事业上所获得的整体成绩,并对今后一段时期内对大数据背景下物流运输新事业,新管理,新运营进行了深度分析,研究。提出运用先进技术,智能化设备及高端产品等新型手段提高企业的高质量发展构想。为努力打造新型智慧物流,开启智能化物流打开了新的局面。 引言 随着科技的不断发展,设备的不断更新,智能化技术的不断涌现,低代码技术,人工智能AI技术等新型智能化应用逐步成为行业应用的主流模式,大数据背景下,阿里云,冀之云,宝之云等“云”技术服务平台成为了行业自动化办公应用中不可或缺的一部分,本文以人工智能AI技术在物流业行业发展中的设计与应用为例,作简要说明。
|
图形学
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(下)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
700 1
|
Java API Apache
|
监控 前端开发 JavaScript
使用JavaScript实现实时报警功能的办公电脑上网监控软件:前端代码
在今天的数字化时代,监控软件已成为许多组织和企业必不可少的一部分,用于保护数据和确保系统的正常运行。本文将介绍如何使用JavaScript编写前端监控软件,包括实时报警功能的实现。我们将探讨一些关键的代码示例,以展示如何构建这样的系统。最后,我们还会讨论如何自动将监控到的数据提交到一个网站。
540 4