【数据结构与算法 | 二叉树篇】二叉树的前中后序遍历(迭代版本)

1. 前言

前文我们实现了二叉树前中后三种遍历方式的递归版本,非常简单. 接下来我们来实现一下其迭代版本.

2. 二叉树的前序遍历

(1). 题

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

 

4f4241238c5f6f39b2eefa04fb8bf95b.jpeg

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

 

cfa471a10c82191fbb16c9d457db515c.jpeg

输入:root = [1,2]
输出:[1,2]

示例 5:

 

80c0a844be1cefc61cd7412c67c5eb8d.jpeg

输入:root = [1,null,2]
输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

(2). 思路

递归调用系统栈,迭代算法自己构造一个栈来模拟. cur指针指向根节点,while循环,条件只要cur不为空并且栈不为空,不断将元素添加到数组中(根),直到访问到最左的叶子节点(左). 此时将其从栈弹出,访问右节点(右). 如果该右节点为空,则继续弹栈,访问弹栈出的节点右节点.不断继续此过程.

(3). 解

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if (root == null) {return list;}Deque<TreeNode> stack = new LinkedList<>();TreeNode cur = root;TreeNode p;while (cur != null || !stack.isEmpty()){if (cur != null) {stack.push(cur);list.add(cur.val);cur = cur.left;} else {p = stack.pop();cur = p.right;}}return list;}
}

3. 二叉树的中序遍历

(1). 题

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

 

3b2da8f54d47998c00453fdad70b070d.jpeg

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

(2). 思路

while循环开始,如果cur不为null则一直压栈(左),直到cur为null,弹栈,并访问该节点(根),继续讨论该节点的右孩子(右). 继续弹栈,该节点的左孩子部分已经完成,访问该节点的值,继续讨论其右孩子.直到循环结束.

(3). 解

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if (root == null) {return list;}Deque<TreeNode> stack = new LinkedList<>();TreeNode cur = root;TreeNode p;while (cur != null || !stack.isEmpty()){if (cur != null) {stack.push(cur);cur = cur.left;} else {p = stack.pop();list.add(p.val);cur = p.right;}}return list;}
}

4. 二叉树的后序遍历

(1). 题

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例 1:

 

7946c3dde8d9e906f146604880196ac6.jpeg

输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

(2). 思路

思路如下.

(3). 解

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> al = new ArrayList<>();if (root == null) {return al;}TreeNode cur = root;TreeNode pop = null;Deque<TreeNode> stack = new LinkedList<>();while (cur != null || !stack.isEmpty()){//只要cur不为null, 一直访问左节点, 并不断入栈if (cur != null) {stack.push(cur);cur = cur.left;} else {//此时栈顶元素的左孩子为null 即其左孩子无需处理TreeNode peek = stack.peek();//peek.right == null表明栈顶元素的右孩子无需处理//peek.right == pop表明栈顶元素的右孩子已经处理完毕if (peek.right == null || peek.right == pop){//访问该栈顶元素, 并弹出al.add(peek.val);//记录处理的节点pop = stack.pop();} else {//else表明该栈顶元素的右孩子待处理, 则cur = peek.rightcur = peek.right;}}}return al;}
}

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

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

相关文章

语音技能云云接入通用平台

Cloud-to-Cloud(云云接入) 前言 项目地址&#xff1a;https://github.com/LeYunone/cloud-to-cloud 配置说明&#xff1a;https://leyunone.com/github-project/voice-cloud-cloud-config.html 注&#xff1a;学习测试以及使用请拉取 master 分支&#xff0c;release 是开发…

python pip 安装

如果您不确定pip的安装路径&#xff0c;可以通过以下命令来查询&#xff1a; pip show pip 这个命令会显示pip的详细信息&#xff0c;其中包括pip安装的路径。如果您想修改pip的默认安装路径&#xff0c;可以使用pip的"--target"参数指定目标路径&#xff0c;例如&a…

8.7k Star!Khoj:你的AI第二大脑、开源RAG Cop​​ilot、平替 MS Copilot与ChatGPT

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 8.7k Star&#xff01;Khoj&#xff1a;你的AI第二大脑、开源RAG Cop​​ilot、平替 MS Copilot与ChatGPT &#x1f31f;你的AI第二大脑。…

zynq-7015启动分析及裸机BootLoader编写(未完待续)

使用lwip-tcp远程对QSPI进行更新、QSPI FLASH启动 W25Q128资料&#xff1a; W25Q128JV datasheet(1/78 Pages) WINBOND | 3V 128M-bit serial flash memory with dual/quad spi (alldatasheet.com) UG585资料&#xff1a; Zynq 7000 SoC Technical Reference Manual-UG585 翻译…

【ARFoundation自学05】人脸追踪(AR Face manager)实现

1. 修改摄像机朝向渲染方式-选中user 这个方式就会调用前置摄像头 2 创建 AR Session、XR Origin&#xff0c;然后在XR Origin上面添加组件 注意&#xff1a;XR Origin 老版本仍然叫 AR Session Origin 接下来在XR Origin上面添加AR Face Manager组件&#xff0c;如下图&am…

剧本杀市场仍在快速发展,剧本杀小程序成为了新的机遇

近年来&#xff0c;剧本杀一直是年轻人的娱乐游戏方式之一&#xff0c;剧本杀行业呈现出了井喷式发展的形势&#xff0c;成为了当下爆火的娱乐方式。目前&#xff0c;剧本杀行业拥有了完善的剧本资源和呈现方式&#xff0c;发展前景非常大。 根据当下的数据显示&#xff0c;剧…

NextJs 实现自定义点火操作

NextJs 实现自定义点火操作 前言实现自定义点火 前言 我希望在Nextjs 启动的时候&#xff0c;能够自定义实现一些项目的初始化逻辑&#xff0c;也可以说是一些点火操作&#xff0c;比如资源的加载&#xff0c;数据的初始化等操作。 实现自定义点火 我们可以在根目录下创建一…

Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)

文章目录 Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)1.开机动画的启动过程概述2.为什么设置了属性之后就会播放&#xff1f; Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41) 1.开机动画的启动过程概述 下面就是BootAnimation的重要部…

移动app测试重要性体现在哪些方面?专业app测试报告获取

移动app测试是指对手机应用进行各种测试和评估的过程&#xff0c;以确保应用的功能、性能和用户体验达到要求。在现代社会中&#xff0c;移动应用已经成为人们日常生活的一部分。无论是社交娱乐、购物支付还是工作学习&#xff0c;移动应用都发挥着不可替代的作用。因此&#x…

单元测试AIR原则:提升代码质量的秘密武器

文章目录 引言一、AIR原则1. Automatic&#xff08;自动化&#xff09;2. Independent&#xff08;独立性&#xff09;3. Repeatable&#xff08;可重复性&#xff09; 二、Automatic&#xff08;自动化&#xff09;三、Independent&#xff08;独立性&#xff09;四、Repeatab…

【MySQL】sql语句之表操作(上)

序言 在上一篇的数据库操作的内容中&#xff0c;学习了两种属性和常用的七种操作&#xff0c;学习是循序渐进的&#xff0c;库的操作学完了&#xff0c;就要开始学习表的操作了&#xff0c;而表可与数据强相关&#xff0c;比如DDL&#xff0c;即数据定义语言&#xff0c;DML&am…

DVWA-XSS(Stored)

Low 观察后端代码&#xff0c;对输入进行了一些过滤和转义。trim(string,charlist) 函数用于移除字符串两侧的空白字符或其他预定义字符&#xff0c;charlist 参数可以规定从字符串中删除哪些字符。stripslashes() 函数用于删除反斜杠。mysqli_real_escape_string() 函数用于对…

【实战】kafka3.X kraft模式集群搭建

文章目录 前言kafka2.0与3.x对比准备工作JDK安装kafka安装服务器增加hosts 修改Kraft协议配置文件格式化存储目录 启动集群停止集群测试Kafka集群创建topic查看topic列表查看消息详情生产消息消费消息查看消费者组查看消费者组列表 前言 相信很多同学都用过Kafka2.0吧&#xf…

tomcat配置请求的最大参数个数和请求数据大小

maxParameterCount"10000" maxPostSize"10485760" maxParameterCount&#xff1a;单个请求最大请求参数个数&#xff1b; maxPostSize&#xff1a;单个请求最大数据大小&#xff0c;1048576010M&#xff1b;

基本算法——位运算

a^b 原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目描述 运行代码 #include<iostream> using namespace std; long long a,b,c,t1; int main() {cin>>a>>b>>c;for(;b;b/2){if(b&1)tt*a%c;aa*a%c;}cout<<t%c; } 代码思路…

逻辑回归及python实现

概述 logistic回归是一种广义线性回归&#xff08;generalized linear model&#xff09;&#xff0c;因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同&#xff0c;都具有 w‘xb&#xff0c;其中w和b是待求参数&#xff0c;其区别在于他们的因变量不同&#x…

App Inventor 2 复制屏幕功能,界面设计更便捷,避免误删组件

“复制屏幕”功能全新上线&#xff0c;中文网独有&#xff08;MIT没有此功能&#xff09;&#xff0c;可以复制屏幕中的普通组件、图片、附件、拓展、代码块。更多升级详情可查看发布日志。 下面演示一下屏幕的复制效果&#xff1a; 1、Screen1屏幕上有若干组件、及一个SQLit…

美业SaaS系统源码分享-收银管理的主要功能

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 博弈美业-收银管理功能 1、同时支持支付宝和微信支付&#xff0c;具有简单便捷安全等优点&#xff0c;并且符…

MySQL之查询性能优化(八)

查询性能优化 MySQL查询优化器的局限性 MySQL的万能"嵌套循环"并不是对每种查询都是最优的。不过还好&#xff0c;MySQL查询优化器只对少部分查询不适用&#xff0c;而且我们往往可以通过改写查询让MySQL高效地完成工作。还有一个好消息&#xff0c;MySQL5.6版本正…

Ffmpeg安装和简单使用

Ffmpeg安装 下载并解压 进入官网 (https://ffmpeg.org/download.html)&#xff0c;选择 Window 然后再打开的页面中下滑找到 release builds&#xff0c;点击 zip 文件下载 环境变量配置 下载好之后解压&#xff0c;找到 bin 文件夹&#xff0c;里面有3个 .exe 文件 然后复制…