二叉树前序,中序,后序非递归遍历(Java)

1.

思路:

首先创建一个栈和顺序表,按照根左右的前序遍历顺序去遍历这棵树,一直往左孩子方向遍历,每遍历到一个结点就入栈并且加入到顺序表里,如果没有左孩子了,就拿出栈顶元素,看它是否有右孩子,如果有,又从右孩子开始,往左孩子方向遍历,如果没有,就继续拿出栈顶元素,如此循环,直到栈为空

class Solution {Stack<TreeNode> stack=new Stack<>();List<Integer> list=new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {if(root==null){//如果为空树return list;}TreeNode cur=root;//cur用来以前序遍历顺序来遍历树while(cur!=null||!stack.isEmpty()){//如果此时有遍历到结点,或者栈不为空while(cur!=null){//如果是此时有遍历到结点stack.push(cur);list.add(cur.val);cur=cur.left;}//此时没有遍历到结点TreeNode top=stack.pop();//拿出栈顶元素if(top.right!=null){//如果有右孩子cur=top.right;//遍历右孩子}}return list;}
}

2.

思路:

同上题一样,只不过由根左右变成左根右,所以往顺序表里面添加元素的地方要继续调整

class Solution {List<Integer> list=new ArrayList<>();Stack<TreeNode> stack=new Stack<>();public List<Integer> inorderTraversal(TreeNode root) {if(root==null){return list;}TreeNode cur=root;while(cur!=null||!stack.isEmpty()){while(cur!=null){stack.push(cur);cur=cur.left;}TreeNode top=stack.pop();list.add(top.val);//说明没有左孩子,到了左根右的根,打印if(top.right!=null){cur=top.right;}}return list;}
}

3.

思路:

因为后序遍历是左右根,所以先遍历到的是根,但最后输出的才是根,贴合栈这种“先进后出”的数据结构,所以要采用到栈这个数据结构

根据左右根的顺序,先一直让左孩子结点全部入栈,如果左孩子为null,则看看现在栈顶元素是否有右孩子,没有就出栈,有就将右孩子入栈,再次循环

但是这里有可能出现死循环,就是下图这种情况

当遍历到A,左孩子为null,此时A为栈顶元素,A有右孩子B,所以B入栈,然后B没有左右孩子,所以B出栈,此时A没有左孩子,A为栈顶元素,A有右孩子B,B又入栈,然后B没有左右孩子,B又出栈……

所以我们还有添加一种判断情况,即已经入栈再出栈了的我们不再入栈,所以要创建一个结点来记录入栈再出栈了的这种结点,如果是B这种结点,则栈顶元素A继续出栈而不是让B这种结点再入栈

class Solution {public List<Integer> postorderTraversal(TreeNode root) {//记录后序遍历的数组List<Integer> list=new ArrayList<>();//如果为空结点,直接返回空数组if(root==null){return list;}Stack<TreeNode> stack=new Stack<>();TreeNode cur=root;TreeNode prev=null;//用来记录已经入栈又出栈了的结点//如果结点不为空,或者栈不为空while(cur!=null||!stack.isEmpty()){//将左孩子全部入栈或者没有左孩子但是有右孩子的while(cur!=null){stack.push(cur);cur=cur.left;}//此时cur为null,看看栈顶元素TreeNode top=stack.peek();//如果栈顶元素也没有右孩子,或者右边已经入栈又出栈了的if(top.right==null||top.right==prev){//将栈顶元素输出并出栈list.add(top.val);stack.pop();//记录当前结点为入栈又出栈了的prev=top;}else{//有右孩子且不是入栈又出栈了的cur=top.right;}}return list;}
}

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

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

相关文章

智能学习辅助系统——后端部分

目录 前言 一、准备工作 1.需求&环境搭建 1.1需求说明 1.2环境搭建 2.开发规范 2.1 开发规范-REST 2.2 开发规范-统一响应结果 3.开发流程 二、部门管理 1.查询部门 &#xff08;1&#xff09;原型和需求 &#xff08;2&#xff09;接口文档 &#xff08;3&…

Unity2D游戏开发-Pak木鱼

在接下来文章里我会以Unity为主一起制作游戏 在unity 里如何制作一个简单的敲木鱼游戏&#xff1f; 创建一个2D场景&#xff08;本人使用Unity2023&#xff09; (每个一段时间要申请一个个人许可证) 点击下方蓝色按钮创建 将以下素材拖动到Assets文件夹中 这张图随意命名我…

深入理解DPO(Direct Preference Optimization)算法

目录 1. 什么是DPO&#xff1f;2. Bradley-Terry模型2.1 奖励模型的训练 3. 从PPO到DPO4. DPO的简单实现5. 梯度分析Ref 1. 什么是DPO&#xff1f; 直接偏好优化&#xff08;Direct Preference Optimization, DPO&#xff09;是一种不需要强化学习的对齐算法。由于去除了复杂的…

SQL Server中如何自动抓取阻塞

背景 当发数据库生阻塞时&#xff0c;可以通过SQL语句来获取当前阻塞的会话情况&#xff0c;可以得到下面的信息 说明&#xff1a;会话55阻塞了会话53。两个会话都执行了update test set fid10 where fid0。 但我们也经常碰到客户生产环境出现阻塞&#xff0c;由于不会抓取或者…

还在拼接字符串生成XML?(Java)

FreeMarker是一个功能强大的Java模板引擎&#xff0c;广泛应用于生成动态内容&#xff0c;如HTML、XML和其他文本格式。本文将介绍FreeMarker的基本使用方法&#xff0c;并提供一个更丰富的XML模板示例&#xff0c;以及模板标签和标识的含义。 1. 引入依赖 <dependency>…

三分钟总结开源流程表单的优势特点

实现流程化办公&#xff0c;可以借助低代码技术平台、开源流程表单的优势特点。作为当前较为理想的平台产品&#xff0c;低代码技术平台凭借够灵活、好操作、可视化界面的优势特点&#xff0c;得到了通信业、医疗、高校等很多行业客户朋友的喜爱与支持。今天一起来看看开源流程…

联华证券-新手炒股入门指南:学习路径与注意事项

学习炒股是一个循序渐进的过程&#xff0c;以下是入门建议以及需要注意的事项&#xff1a; 学习炒股的入手步骤 掌握基础知识&#xff1a; 股票市场基础&#xff1a;了解什么是股票、股市的运作机制、股票的种类等基本概念。 常用术语&#xff1a;熟悉如市盈率&#xff08;P/…

ET6框架(三)前后端通讯分析

文章目录 一、信息的通讯二、网络通讯协议的“理像模型”三、网络通讯协议的“四层模型”四、什么是 Socket&#xff1f;五、Socket通讯流程 一、信息的通讯 网络消息的发送类似于邮寄信件的流程&#xff0c;需要一个地址及收件人。 在网络通讯中通常我们需要一个IP地址及端口…

uni-app启动本地开发环境,修改默认端口号

vite.config.js: import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni";// https://vitejs.dev/config/ export default defineConfig({server: {port: 3006,},plugins: [uni()], });人工智能学习网站 https://chat.xutong…

趣味算法------过河卒

目录 ​编辑 题目描述 解题思路 具体代码 总结 问题描述&#xff1a; 解决方案&#xff1a; 代码实现&#xff1a; 关键点&#xff1a; 题目描述 棋盘上 A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C…

自动化通过cmd命令行并以特定账户连接到远程机器

1 建一个taskschedule运行cmd命令 2 cmd命令示例&#xff1a; 机器名加域名 mstsc /v:"<MachineName>.xxx.xxx.com"或者是机器IP地址 mstsc /v:"10.148.66.178"3 设置用特定账户登陆 用户名可以写 <要连接的机器名><用户名> 勾选“记住…

川崎机器人维修请开启马达电源报警故障

‌川崎机器人故障代码主要用于指示机器人的不同运行问题和状态&#xff0c;帮助快速识别和解决这些问题。‌Kasawaki机械手故障代码通常以字母和数字的组合形式出现&#xff0c;其中字母代表故障的类型&#xff0c;而数字则是具体的代码编号。这些代码可以分为‌P‌代表操作错误…

05:创建逻辑软件元件库

1.创建逻辑软件元件库 点击 “编辑电参数” 1.1常规设置 1.2PCB封装 1.3门 1.4管脚 1.5检查元件 点击确定 1.6点击保存 2.处理重叠问题 2.1查看处理后的显示

《JavaEE进阶》----5.<SpringMVC②剩余基本操作(CookieSession)>

Cookie和Session简介。 Spring MVC的请求中 Cookie的设置和两种获取方式 Session的设置和三种获取方式。 三、&#xff08;接上文&#xff09;SpringMVC剩余基本操作 3.2postman请求 3.2.10 获取Cookie和Session 1.理解Cookie 我们知道HTTP协议自身是“无状态”协议。 &qu…

XtQuant接口概述,想用miniQMT做量化哪家券商支持?

XtQuant.XtData 行情模块 xtdata是xtquant库中提供行情相关数据的模块&#xff0c;本模块旨在提供精简直接的数据满足量化交易者的数据需求&#xff0c;作为python库的形式可以被灵活添加到各种策略脚本中。 主要提供行情数据&#xff08;历史和实时的K线和分笔&#xff09;、…

《黑神话悟空》:国产3A游戏的崛起与AI绘画技术的融合

一、游戏简介 近年来&#xff0c;国产3A游戏《黑神话悟空》以其精美的画面、丰富的剧情和独特的文化底蕴吸引了众多玩家的关注。这款游戏以中国古典名著《西游记》为背景&#xff0c;讲述了孙悟空历经磨难&#xff0c;最终成长为斗战胜佛的故事。在游戏制作过程中&#xff0c;开…

SpringBoot整合Mybatis,Junit (复现之前写的一个SSM项目)

引言 如下是之前写的一个SSM项目&#xff08;纯注解版&#xff09;&#xff0c;现在我们要把它改造成一个SpringBoot项目&#xff0c;以体现SpringBoot的方便。主要需要关注的文件已经用红框标出。 1.config文件夹里面的是Spring&#xff0c;SpringMvc&#xff0c;Mybatis的配…

zoom 会议 javascript 转录例子

一、启动server-to-server zoom api服务&#xff0c;用于创建会议&#xff0c;参考&#xff1a;如何使用Zoom API创建一个会议&#xff1f;-CSDN博客 二、启动meetingsdk-auth-endpoint服务&#xff0c;用于加入会议&#xff0c;参考&#xff1a;zoom 会议机器人web例子-CSDN博…

中国城市经济韧性数据集(2007-2022年)

数据来源&#xff1a;数据来自历年《中国城市统计NJ》、各省市《统计NJ》及《中国区域经济统计NJ》 时间范围&#xff1a;2007-2022年 数据范围&#xff1a;中国地级市样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff08;原始数据计算代码最终数据&…

【binder】【android12】【2.servicemanager启动——全源码分析】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …