1. 对于树的遍历我们最常用的三种遍历方法分别是前序遍历、中序遍历和后序遍历,使用的方法是深度优先遍历树的每一个节点,这些遍历方法都是使用递归函数来进行实现的,在数据量大的情况下是比较低效的,原因在于系统帮助我们调用了一个栈并且做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可以使用非常简单的代码来实现,所以我们可以模仿系统中调用的栈自己可以来写一下栈,模仿其中的过程就可以完成对于三种遍历算法的实现,使用自定义的栈来代替系统栈可以得到效率上的提升,下面是对于后序遍历的非递归算法的实现

2. 首先模仿这个系统栈我们需要清楚的是系统栈为我们做了什么事情,下面以一棵二叉树为例来模仿其中的节点入栈与出栈的过程

创建的二叉树如下:

后序遍历为:5 3 2 4 1

先序遍历为:1 2 5 3 4

逆后序遍历为:1 4 2 3 5

从逆后序遍历与先序遍历的关系中我们可以知道逆后序遍历序列为先序遍历交换左右子树的遍历顺序得到的,所以我们得到了逆后序序列之后然后逆序就可以得到后序遍历的序列了,所以需要两个栈,第一个栈用来存储先序遍历交换左右子树的遍历的中介结果,第二个是存储后序遍历的结果(逆序也就是可以理解为先进后出的意思)

下面是模仿元素进栈与出栈的过程:

① 1节点进栈,在循环中弹出1节点压入到第二个栈中,发现左右节点不为空那么将左右节点压入栈1,这个与先序遍历中将左右子树压入到栈顶的顺序是相反的

② 弹出4节点压入到第二个栈中,发现左右孩子都为空那么不进行任何的操作

③ 弹出2节点压入到第二个栈中,发现左右节点不为空那么将左右节点压入到栈1中

④ 弹出3节点压入到第二个栈中,发现左右孩子都为空不进行任何操作

⑤ 弹出5节点压入到第二个栈中,发现左右孩子都为空不进行任何操作

最后栈为空那么退出循环结束

3. 具体的代码如下:

import java.util.Stack;
public class Main {public static void main(String[] args) {TreeNode<Integer> root = new TreeNode<Integer>(1);TreeNode<Integer> l = new TreeNode<Integer>(2);TreeNode<Integer> r = new TreeNode<Integer>(4);TreeNode<Integer> ll = new TreeNode<Integer>(5);TreeNode<Integer> lr = new TreeNode<Integer>(3);root.left = l;root.right = r;l.left = ll;l.right = lr;postOrder(root);}@SuppressWarnings({ "rawtypes", "unchecked" })private static void postOrder(TreeNode<Integer> root) {Stack<TreeNode> src = new Stack<TreeNode>();Stack<TreeNode> res = new Stack<TreeNode>();src.push(root);while(!src.isEmpty()){TreeNode<Integer> p = src.pop();res.push(p);if(p.left != null){src.push(p.left);}if(p.right != null){src.push(p.right);}}//输出最终后序遍历的结果while(!res.isEmpty()){System.out.print(res.pop().val + " ");}   }public static class TreeNode<T>{T val;TreeNode<T> left;TreeNode <T> right;public TreeNode(T val) {super();this.val = val;}}
}

二叉树的后序遍历非递归算法相关推荐

  1. 二叉树的后序遍历(非递归算法)

    /*     后序遍历(非递归算法)     ①先序遍历顺序:根节点-左孩子-右孩子     ②后序遍历顺序:左孩子-右孩子-根节点     ③后序遍历倒过来:根节点-右孩子-左孩子     ①和③对 ...

  2. 二叉树:后序遍历非递归算法

    分析:后序遍历是三种遍历中最难的一种,后序遍历的特点为左右根,并且也需要借助一个栈来完成,如图,虚线表示p,q最开始的位置,用r指向最近访问过的结点.首先从根节点开始,沿着根的左孩子,将左孩子依次进行 ...

  3. 数据结构二叉树后序遍历非递归算法

    后序遍历的非递归代码 void PostOrder(BiTree T) { // Add your code hereif(T==NULL) return; //如果为空,则退出Stack s;Ini ...

  4. 二叉树后序遍历非递归算法(详解)

    前序和中序都比较简单 后序我按自己的理解好好说一下吧,基本思路是利用堆栈将递归转化为循环 首先定义节点结构 struct BTNode {int val;bool visR;bool visL;BTN ...

  5. C++实现二叉树中序遍历非递归算法

    /*二叉树的中序遍历非递归算法目标遍历的二叉树:1/ \2 4/ \3 5 待输出结果为3,2,5,1,41.首先得用上面定义的结构体把这颗树表示出来2.表示出这颗树后在调用二叉树的中序遍历非递归算法 ...

  6. 二叉树后序遍历_二叉树后序遍历非递归实现

    二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...

  7. 二叉树后序遍历(非递归)

    原文地址为: 二叉树后序遍历(非递归) 二叉树的递归遍历算法就不用说了:在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着 ...

  8. 二叉树的后序遍历(递归和非递归)

    二叉树的后序遍历 后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历.后序周游,记为左右根,简记:左右根. 步骤(非递归): ⼆叉树的后序遍历顺序是左-右-根.在这里仍然采用棧来进行辅助,具体步骤如 ...

  9. 二叉树中序遍历非递归算法实现详解

    二叉树是数据结构中的经典结构,也是应用很广泛的结构之一.二叉树具有一些特定的性质,如 n0 = n2+1,在一些应用中,常常要求在树中查找具有某些特征的节点,或者对树中节点进行处理,即遍历二叉树的问题 ...

最新文章

  1. 当世界模型被用于sim2real:机器人通过视觉想象和交互尝试来学习
  2. memcached完全剖析
  3. PowerShell-将CSV导入SQL Server
  4. java混淆工具zelix比较_vscode,java环境
  5. 还不知道事务消息吗?这篇文章带你全面扫盲!
  6. tsinsen A1333
  7. 数据分析 第三篇:数据特征分析(分布分析+帕累托分析)
  8. jdbcTemplate注入过程
  9. matlab判断李雅普诺夫稳定性
  10. 精品思维导图模板合集,锻炼你的逻辑思维,提升能力空间
  11. Python 爬虫--网站下载器
  12. 2022年5月17日 点扩展函数的matlab仿真学习
  13. 数据分析案例-气象数据分析
  14. PhotoShop一键修改4的倍数图片工具
  15. 《C Primer Plus》—第九章:函数(指针间接,函数及其定义方式,ANSI C原型,递归,函数调用的底层原理)
  16. Windows电脑开机蓝屏(2)
  17. R实现一次性合并多个数据框
  18. 磁盘阵列-FUJITSU Storage ETERNUS DX100 S3
  19. c 语言中并查集的用法,并查集基本介绍
  20. System.Data.SQLite 与 Microsoft.Data.Sqlite

热门文章

  1. 音视频 FFmpeg
  2. java 车牌正则表达式_车牌号校验正则表达式
  3. CodeLab:Android fundamentals 01.3:Text and scrolling views
  4. 从IBN-Net到Switchable Whitening:在不变性与判别力之间权衡
  5. 微信聊天记录导出及年度报告软件使用方法
  6. 启动2015世界人工智能系统智商排名,检测人工智能是否超越人类
  7. 基于百度API的开源自动翻译.srt文件软件的实现的几个技术细节总结附源代码
  8. 中国植入医疗器械行业“十四五”规划研究与运营动向分析报告2021-2027年版
  9. 最新版晨风机器人4.4.0.7.2免费授权解锁卡片框架
  10. 【20171013】unity+cardboard做一个VR眼镜