https://blog.csdn.net/qiuxinfa123/article/details/84880786
2.先序遍历。非递归先序遍历的思路如下:
1.先将根节点入栈
2.访问根节点
3.如果根节点存在右孩子,则将右孩子入栈
4.如果根节点存在左孩子,则将左孩子入栈(注意:一定是右孩子先入栈,然后左孩子入栈)
5.重复2-4

//先序遍历非递归public void preOrder2(){Stack<Node> stack = new Stack();Node p = root;stack.push(p);while (!stack.empty()){p = stack.pop();//输出当前节点System.out.println(p);//右节点不为空入栈if (p.right != null){stack.push(p.right);}if (p.left != null){stack.push(p.left);}}}

3.中序遍历。 非递归中序遍历的思路如下:
1.先将根节点入栈
2.将当前节点的所有左孩子入栈,直到左孩子为空
3.访问栈顶元素,如果栈顶元素存在右孩子,则继续第2步
4.重复第2、3步,直到栈为空并且所有的节点都被访问

  //中序遍历非递归public void infixOrder2(){Stack<Node> stack = new Stack<>();Node p = root;while (p != null || !stack.empty()){//根节点和当前节点的所有左子节点入栈while (p != null){stack.push(p);p = p.left;}//访问栈顶p = stack.pop();//输出System.out.println(p);if (p.right != null){p = p.right;}else {p = null;}}}

4.后序遍历。 后续遍历的非递归实现思路:
1.根节点入栈
2.将根节点的左子树入栈,直到最左,没有左孩子为止
3.得到栈顶元素的值,先不访问,判断栈顶元素是否存在右孩子,如果存在并且没有被访问,则将右孩子入栈,否则,就访问栈顶元素

   //后序遍历非递归public void postOrder2(){Stack<Node> stack = new Stack<>();Node p = root;Node pre = null;//上一次访问的节点while (p!=null || !stack.empty()){//根节点和所以左孩子入栈while (p != null){stack.push(p);p = p.left;}//访问栈顶元素但不出栈p = stack.peek();if (p.right == null || p.right == pre){p = stack.pop();System.out.println(p);pre = p;p = null;}else {p = p.right;}}}

二叉树遍历的非递归方法相关推荐

  1. 漫谈二叉树遍历(非递归)

    ------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...

  2. java使用btree_java数据结构之二叉树遍历的非递归实现

    算法概述 递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似. ...

  3. 二叉树遍历的非递归算法

    大一下半期数据结构 知识点 递归算法虽然简单,但一般而言,其执行效率并不高.对于二叉树的遍历操作,可以仿照递归算法执行过程中工作栈的状态变化得到非递归算法. 一.前序遍历非递归算法 二叉树前序遍历非递 ...

  4. 二叉树遍历(非递归)

    文章目录 二叉树遍历非递归版本 前序遍历 中序遍历 后序遍历 层序遍历 层序遍历+map记录高度 二叉树遍历非递归版本 前序遍历 如果右侧不为空,则右侧进栈,随后是左侧进栈.因为栈是先进后出,所以实现 ...

  5. 二叉树遍历的非递归实现

    作者:冯老师,华清远见嵌入式学院讲师. 一.递归的定义及特点 递归是指某个函数直接或间接的调用自身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出.递归问题的关 ...

  6. 二叉树遍历 递归/非递归/morris

    前序遍历 力扣 递归 class Solution { public:vector<int> ans;vector<int> preorderTraversal(TreeNod ...

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

    #include <iostream> #include <vector> #include <stack>using namespace std;//思路分析 / ...

  8. python 二叉树遍历递归非递归_python实现二叉树递归遍历与非递归遍历

    一.中序遍历 前中后序三种遍历方法对于左右结点的遍历顺序都是一样的(先左后右),唯一不同的就是根节点的出现位置.对于中序遍历来说,根结点的遍历位置在中间. 所以中序遍历的顺序:左中右 1.1 递归实现 ...

  9. 二叉树 2.0 -- 非递归遍历

    二叉树递归遍历存在的问题 如果我们的二叉树只有左子树,而且树的高度还很深的时候,这个时候递归调用遍历的时候,栈帧空间开辟的较大,很可能造成栈溢出.但是我们一个程序中,为堆分配的空间要比栈大的多,这个时 ...

最新文章

  1. 变焦即可判断物体的距离
  2. 百度危矣:乱评程苓峰《360的章鱼手要抢谁家饭碗?》
  3. mysql索引使增删变慢_mysql优化(四)–索引
  4. maven 按业务拆分模块_gradle|springboot+gradle多模块化应用
  5. Netty 的基本简单实例【服务端-客户端通信】
  6. JavaScript 插件的书页翻转效果
  7. COLING 2020 | 字符感知预训练模型CharBERT
  8. testlink配置修改
  9. jeb安装教程_JEB2插件教程之一
  10. Python画图显示中文
  11. 黑群晖 7.0 安装
  12. php开发微信小程序教程,从零开始开发微信小程序步骤(三)
  13. crmeb安装教程说明
  14. python 主成分分析 (PCA)
  15. 【毕业设计】大数据 电影数据分析与可视化系统 - python Django 大数据 可视化
  16. 计算机网络安全学校,网络空间安全学院
  17. Mapped Statements collection already contains value for com.bai.dao.Userdao.UserByID
  18. pytorch seq2seq模型中加入teacher_forcing机制
  19. Android 时间格式化
  20. 回首过去 展望未来

热门文章

  1. 一个(伪)MaterialDesign风格的博客园皮肤
  2. Flex AIR 文件对象操作
  3. Winform开发之ADO.NET对象Connection、Command、DataReader、DataAdapter、DataSet和DataTable简介...
  4. CF Vicious Keyboard 构造水题
  5. UVa-10820 Send a Table 欧拉函数
  6. 轻量级锁_并发编程实战05:锁的状态
  7. python基础公式_一、Python基础(数据类型、基本函数、基本运算)
  8. numpy数组按某一维度相加_Python数据分析之NumPy(高级篇)
  9. python 隐藏命令行窗口_python如何只执行cmd中的动作,但消除或隐藏cmd窗口 - 小众知识...
  10. cad刷新快捷键_第16期分享:常用电脑快捷键是哪些?