java迭代实现二叉树先中后序遍历(非递归)

【README】

本文复习了通过java迭代实现 二叉树先序,中序,后序遍历;

本文引入了 栈,替换了递归,对二叉树进行遍历

补充:使用递归遍历二叉树缺点

  • 众所周知,每次递归,实际是把方法调用帧,连同方法参数一起压入到方法栈; jvm中的方法栈的深度有限,一旦二叉树节点个数过多,可能导致栈溢出的情况
  • 我们通过压入显式栈,替换了递归,即替换了方法栈;在可能的情况下,即便二叉树节点过多,也不会报栈溢出异常;
  • 显式栈,可以用 数组来实现,不一定是 Stack类;

【1】二叉树遍历

【1.1】先序遍历

1)遍历规则

  • 对于一颗二叉树,先遍历其根节点,再遍历左孩子,最后遍历右孩子;
  • 若左孩子下面挂了一棵树(左子树),则继续遍历左子树;
  • 若右孩子下面一棵树(右子树),则继续遍历右子树;

2)先序遍历迭代实现:

/*** @description 先序遍历* @author xiao tang* @date 2022/11/20*/public static void printByPreOrder(MyBinTree root) {Stack<MyBinTree> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()) {root = stack.pop();if (root == null) {System.out.print("NULL ");} else {System.out.print(root.value + " ");stack.push(root.right);stack.push(root.left);}}}// 二叉树 
public class MyBinTree {int value;MyBinTree left;MyBinTree right;public MyBinTree(int value) {this.value = value ;}
}

【1.2】中序遍历

1)遍历规则

  • 对于一颗二叉树,先遍历左孩子,再遍历根节点,最后遍历右孩子;
  • 若左孩子下面挂了一棵树(左子树),则继续遍历左子树;
  • 若右孩子下面一棵树(右子树),则继续遍历右子树;

2)中序遍历迭代实现:

/*** @description 中序遍历* @author xiao tang* @date 2022/11/20*/public static void printByInOrder(MyBinTree root) {Stack<MyBinTree> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()) {if (root != null) {stack.push(root.left);root = root.left;} else {// 左儿子或右儿子为空stack.pop();System.out.print("NULL ");if (!stack.isEmpty()) {root = stack.pop();System.out.print(root.value + " ");stack.push(root.right);root = root.right;}}}}

【1.3】后序遍历

1)遍历规则

  • 对于一颗二叉树,先遍历左孩子,再遍历右孩子,最后遍历根节点;
  • 若左孩子下面挂了一棵树(左子树),则继续遍历左子树;
  • 若右孩子下面一棵树(右子树),则继续遍历右子树;

2)后序遍历迭代实现:

/*** @description 后序遍历* @author xiao tang* @date 2022/11/20*/public static void printByPostOrder(MyBinTree root) {Stack<MyBinTree> stack = new Stack<>();stack.push(root);// 空的右孩子哨兵, 空的左孩子哨兵为null, 以把空右孩子 与 空左孩子 区别开MyBinTree rightNullNode = new MyBinTree(0);while(!stack.isEmpty()) {if (root != null && root != rightNullNode) {stack.push(root.left);root = root.left;} else {// 左孩子或右孩子为nullMyBinTree lastNodeVisited = stack.pop();System.out.print("NULL ");while (!stack.isEmpty()) {root = stack.peek();MyBinTree rightChild = root.right != null ? root.right : rightNullNode;if (rightChild == lastNodeVisited) {// 若刚刚访问的节点 等于 右孩子,则根节点弹出lastNodeVisited = stack.pop();System.out.print(lastNodeVisited.value + " ");} else {stack.push(rightChild);root = rightChild;break;}}}}}

【2】测试案例

1)二叉树结构

 2)测试案例代码:

public static void main(String[] args) {MyBinTree head = new MyBinTree(1);head.left = new MyBinTree(2);head.right = new MyBinTree(3);head.left.left = new MyBinTree(4);head.left.right = new MyBinTree(5);head.right.left = new MyBinTree(6);head.right.right = new MyBinTree(7);head.left.left.left = new MyBinTree(8);head.left.right.right = new MyBinTree(9);// 先序打印printByPreOrder(head);System.out.println();// 中序打印printByInOrder(head);System.out.println();// 后序打印printByPostOrder(head);}

3)打印结果:

先序遍历:1 2 4 8 NULL NULL NULL 5 NULL 9 NULL NULL 3 6 NULL NULL 7 NULL NULL 
中序遍历:NULL 8 NULL 4 NULL 2 NULL 5 NULL 9 NULL 1 NULL 6 NULL 3 NULL 7 NULL 
后序遍历:NULL NULL 8 NULL 4 NULL NULL NULL 9 5 2 NULL NULL 6 NULL NULL 7 3 1

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

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

相关文章

漫画:什么是分布式锁

转载自 漫画&#xff1a;什么是分布式锁分布式锁的实现有哪些&#xff1f;1.Memcached分布式锁利用Memcached的add命令。此命令是原子性操作&#xff0c;只有在key不存在的情况下&#xff0c;才能add成功&#xff0c;也就意味着线程得到了锁。2.Redis分布式锁和Memcached的方式…

程序员求职面试三部曲之一:选择合适的工作单位

前不久在知乎上看到一个话题&#xff0c;大概是说中国比国外好的有哪些方面&#xff0c;网友们例举了一大堆&#xff0c;其中有一条是说“在中国找工作比较容易”。 是的&#xff0c;特别对于我们IT从业者来说&#xff0c;找工作真的是小菜一碟&#xff1b;只要肯在网络上公开简…

处理api返回的数据_API 乐队指挥家,网关服务正式上线

随着知晓云小伙伴们业务的发展&#xff0c;对我们服务的支持又有了新的要求&#xff0c;比如在对接第三方服务时&#xff0c;需要自定义数据结构等。为此&#xff0c;经过 32 次的需求讨论会以及工程师们的紧张开发后&#xff0c;知晓云 API 网关诞生了。你可以通过可视化界面配…

数据结构排序总结

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析个人的学习心得体会&#xff0c;源代码均为原创&#xff1b; 0.2&#xff09; 本文列出了数据结构中基本上所有的数据结构排序算法&#xff0c; 整理了相关的博文&#xff08;源代码&#xff09;&#xff1b; 0.3…

IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR

失败请求跟踪规则&#xff08;FailedRequest Tracing Rules&#xff09;是IIS7中对请求处理进行诊断的强大的工具。我们本篇文章将会带领大家一步步的来配置失败请求跟踪规则&#xff0c;并且告诉大家如何使用这些信息来诊断ARR。 要真正的理解本篇文章要讲述的知识&#xff0c…

减一天 日期函数_一文掌握excel中的日期函数

在excel中&#xff0c;因为日期的特殊性&#xff0c;大部分关于日期的运算都要用到特有的函数。对于大多数小伙伴们可能没有专门去学习过日期函数都有哪些&#xff1f;如何运用&#xff1f;可以实现什么样的功能&#xff1f;今天小编就为大家整理出来并详细介绍一下常用的日期函…

软件开发的微信公众号分享

一、已阅 &#xff08;1&#xff09;程序员面试&#xff08;mvpjob&#xff09;&#xff08;2&#xff09;程序员小灰&#xff08;chengxuyuanxiaohui&#xff09;&#xff08;3&#xff09;Hollis&#xff08;hollischuang&#xff09;&#xff08;4&#xff09;Java技术栈&am…

算法递归简论

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c;旨在了解设计 递归程序 的相关法则和技巧&#xff1b; 0.2&#xff09; 我记忆尤新的一点是&#xff1a; 凡事可以用循环代替的递归函数&#xff0c;它就不是一个好的递归函数&#xff0c;对我帮助很大…

python三维矩阵可视化_科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)...

Mlab了解Mlab是Mayavi提供的面向脚本的api&#xff0c;他可以实现快速的三维可视化&#xff0c;Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化。过程为&#xff1a;.建立数据源.使用Filter(可选)对数据进行加工.添加可视化模块&#xff0c;我们可以通过修改可视化模块的属…

程序员求职面试三部曲之二:提高面试的成功率

一、选择有招聘诚意的企业 一则好的招聘信息应该是准确、清晰和真实的。任何夸大宣传、提供虚假信息的企业都可以认为缺乏招聘诚意。 我们通过解读企业的招聘信息&#xff0c;主观上能够判断这家企业是否很有招聘诚意&#xff0c;我觉得主要体现为以下两个方面&#xff1a; 1.、…

秒杀系统设计的 5 个要点:前端三板斧+后端两条路

转载自 秒杀系统设计的 5 个要点&#xff1a;前端三板斧&#xff0b;后端两条路高并发&#xff0c;cache&#xff0c;锁机制基于缓存架构redis,Memcached的先进先出队列。稍微大一点的秒杀&#xff0c;肯定是分布式的集群的&#xff0c;并发来自于多个节点的JVM&#xff0c;syn…

http响应消息的响应状态码和意义

200&#xff1a;表示一切正常&#xff1b;400&#xff1a;无效请求&#xff0c;指出客户机请求中有不正确的语法格式&#xff1b;404&#xff1a;找不到&#xff0c; 服务器上不存在客户机所请求的资源&#xff1b;&#xff08;常见状态码&#xff09;405&#xff1a;不允许此请…

python网络模块_Python的pyroute2网络模块-阿里云开发者社区

Pyroute2是纯python的netlink库&#xff0c;只需要python标准库不需要其他第三方的库。最常用的是监控事件&#xff0c;例如监控磁盘空间事件&#xff1a;from pyroute2 import DQuotSocketwith DQuotSocket() as ds:for messagein ds.get():print(message)或者监控IP路由from …

ASP.NET Core 开发-中间件(Middleware)

ASP.NET Core开发&#xff0c;开发并使用中间件(Middleware)。 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件。 每个组件选择是否传递给管道中的下一个组件的请求&#xff0c;并能之前和下一组分在管道中调用之后执行特定操作。 具体如图&#xff1a; 开发中间…

高性能、高可用平台架构的演变过程

转载自 高性能、高可用平台架构的演变过程开篇概述 在如今移动互联网、互联网、大数据的时代&#xff0c;各类的互联网网站、平台异常突起&#xff0c;如同雨后春笋&#xff0c;有种“忽如一夜春风来&#xff0c;千树万树梨花开”感觉。 对于移动互联网时代的平台来说&#xff…

6 使用soap客户端_网络协议 20 - RPC 协议(上)- 基于XML的SOAP协议

上一节我们了解 RPC 的经典模型和设计要点&#xff0c;并用最早期的 ONC RPC 为例子&#xff0c;详述了具体的实现。而时代在进步&#xff0c;ONC RPC 逐渐因为各种问题被替代&#xff0c;SOAP 协议就是替代者之一。ONC RPC 存在的问题ONC RPC 将客户端要发送的参数&#xff0c…

关于HashMap容量的初始化,还有这么多学问

转载自 关于HashMap容量的初始化&#xff0c;还有这么多学问在《HashMap中傻傻分不清楚的那些概念》文章中&#xff0c;我们介绍了HashMap中和容量相关的几个概念&#xff0c;简单介绍了一下HashMap的扩容机制。文中我们提到&#xff0c;默认情况下HashMap的容量是16&#xff0…

Microservice Anti-patterns

在最近的一次Microservices Practitioner Summit中&#xff0c;原Netflix工程师介绍了一种越来越常见的对Microservice的误用。简单地说&#xff0c;大家在搭建一个基于Microservice的服务时常常依赖同一套类库&#xff0c;进而使得Microservice中的各个子服务无法选择最适合的…

css 图片换行_好程序员web前端学习路线分享CSS浮动-文档流篇

1、纯文本的排列。文档流就像我们的文本内容一样&#xff0c;所有的文字都会紧挨着&#xff0c;一个个排列下来&#xff0c;如果到了边界&#xff0c;就会换一行排列。当然如果敲回车或者按下空格键一般都会认为是一个词间距&#xff0c;因为英文中每个单词之间是有距离的&…

京东购物车的 Java 架构实现及原理

转载自 京东购物车的 Java 架构实现及原理 今天来写一下关于购物车的东西, 这里首先抛出四个问题: 1&#xff09;用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码  问&#xff1a;购物车商品还在吗&#xff1f; 2&#xff09;用户登陆了用户名密…