算法通关村——迭代实现二叉树的前中后序遍历

news/2024/11/17 4:53:57/

前言

        递归就是每次执行方法调用都会先把当前的局部变量、参数值和返回地址等压入栈中,后面在递归返回的时候,从栈顶弹出上一层的各项参数继续执行,这就是递归为什么能够自动返回并执行上一层的方法的原因。因此,我们也可以模拟一个栈,将结果压入栈中,然后再从栈中弹出节点,就这样进行左右子树的遍历

迭代法实现前序遍历

前序遍历是中左右,如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。 不难写出如下代码: (注意代码中,空节点不入栈) 

 代码实现

public List<Integer> preOrderTraverse(TreeNode root){List<Integer> res = new ArrayList<>();if(root == null){return res;}Deque<TreeNode> stack = new LinkedList<>();TreeNode temp = root;while(!stack.isEmpty() || temp != null){while(temp != null){res.add(temp.val);stack.push(temp);temp = temp.left;}temp = stack.pop();temp = temp.right;}return res;
}

 迭代法实现中序遍历

 代码实现

  /*** 迭代法  实现  中序遍历* @param root 根节点* @return 中序遍历的节点集合*/public List<Integer> cenOrderTraverse(TreeNode root){List<Integer> res = new ArrayList<>();if (root == null){return res;}Deque<TreeNode> stack = new LinkedList<>();while ( root != null || ! stack.isEmpty()){while (root != null){stack.push(root);root = root.left;}root =  stack.pop();res.add(root.val);root = root.right;}return res;}

 迭代法实现后序遍历 

 实现要点

        后序遍历的非递归实现有三种基本的思路: 反转法、访问标记法、和Morris法可惜三种理解起来都有些难度,如果头发不够,可以等一等再学习。
        这里只介绍一种好理解又好实现的方法: 反转法

实现思路 

如下图,我们先观察后序遍历的结果是seg=9 5 7 4 3,如果我们将其整体反转的话就是new seq={3 4 7 5 9}

image.png

          要得到new seq的方法和前序遍历思路几乎一致,只不过是左右反了。前序是先中间,再左边然后右边,而这里是先中间,再后边然后左边。那我们完全可以改造一下前序遍历,在前序基础上修改左右孩子进入栈的顺序,即先遍历右孩子,将其压入栈,最后才遍历左孩子,得到序列new seq之后再通过Collections工具类的reverse()方法,再reverse一下就是想要的结果了,代码如下:

    /*** 反转法  实现  后序遍历* @param root 根节点* @return 后序遍历的节点集合*/public List<Integer> postOrderTraverse(TreeNode root){ArrayList<Integer> res = new ArrayList<>();if (root == null){return res;}Deque<TreeNode> stack = new LinkedList<>();TreeNode node = root;while (!stack.isEmpty() || node != null){while (node != null){res.add(node.val);stack.push(node);node = node.right;}node = stack.pop();node = node.left;}Collections.reverse(res);return res;}

 


http://www.ppmy.cn/news/1014567.html

相关文章

【MongoDB】解决ProxmoxVE下CentOS7虚拟机安装MongoDB6后启动失败的问题

目录 安装步骤: 2.1 配置yum源 2.2 安装MongoDB 2.3 启 动MongoDB ProxmoxVE上新装的CentOS7.4虚拟机,安装MongoDB6。 安装步骤: 2.1 配置yum源 # 创建mongodb yum源(https://www.mongodb.co

2023年8月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

Client-go操作Deployment

在工作中需要对kubernetes进行自定义资源的开发&#xff0c;操作K8s的资源肯定是必不可少的。K8s原生语言是用Go编写的&#xff0c;所以在CRD中使用client-go来操作资源。本次介绍一下使用client-go来操作Deployment。 1. 创建main函数 func main() {homePath : homedir.Home…

你真的懂OP吗?知道什么是OP吗?看完你就懂了!

运维到底是干什么的&#xff1f;估计连运维工程师本身都不清楚&#xff0c;小编各种搜索也没找到答案&#xff0c;问了很多运维老员工&#xff0c;终于总结出了运维工程师的工作内容。 01运维的定义本质上是对网络、服务器各个阶段的运营与维护&#xff0c;在成本、稳定性、效率…

优思学院|成功「质量工程师」的关键技能

质量工程师是一个需要耐心、细心、坚持态度、沟通能力、协调能力的工作&#xff0c;更需要持续学习强化自身的专业知识。 质量工程师负责审核、客户投诉的调查、过程的改进以达到质量之提升&#xff0c;他們也必须要预警生产线风险、质量异常&#xff0c;并且协调不同的部門一…

Day 24 C++ deque容器

文章目录 deque容器基本概念定义特点双端性动态大小随机访问插入和删除高效内存管理迭代器支持 deque与vector区别内部工作原理 deque构造函数函数原型 deque赋值操作函数原型 对vector容器的大小操作函数原型注意 deque 插入和删除函数原型两端插入操作指定位置操作总结 示例 …

Flask进阶:构建RESTful API和数据库交互

在初级教程中&#xff0c;我们已经介绍了如何使用Flask构建基础的Web应用。在本篇中级教程中&#xff0c;我们将学习如何用Flask构建RESTful API&#xff0c;以及如何使用Flask-SQLAlchemy进行数据库操作。 一、构建RESTful API REST&#xff08;Representational State Tran…

网络安全进阶学习第十二课——SQL手工注入3(Access数据库)

文章目录 注入流程&#xff1a;1、判断数据库类型2、判断表名3、判断列名4、判断列数1&#xff09;判断显示位 5、判断数据长度6、爆破数据内容 注入流程&#xff1a; 判断数据库类型 ——> 判断表名 ——> 判断列名 ——> 判断列名长度 ——> 查出数据。 asp的网…