算法 非递归中序遍历二叉树总结(2种方法)

@author:Jingdai
@date:2020.12.03

传送门

  • 非递归先序遍历二叉树
  • 非递归后序遍历二叉树

方法1

先序遍历是第一次遇到该节点遍历;中序是第二次遇到该节点遍历;而后序是第三次遇到该节点遍历。非递归用栈进行遍历,第一次遇到就是压栈时,第二次是弹栈时,所以中序遍历应该弹栈的时候进行遍历。弹栈后代表弹栈节点及其左子树已经遍历完了,所以此时将弹栈节点的右子节点压栈,对其右子树进行同样的操作。代码如下。

public static void inOrderTraverse(TreeNode root) {TreeNode p = root;LinkedList<TreeNode> stack = new LinkedList<>();while (p != null || stack.size() != 0) {while (p != null) {stack.push(p);p = p.left;}p = stack.pop();System.out.println(p.val);p = p.right;}
}

其实仔细观察代码的话会发现其实中序和先序代码除了遍历(这里就是输出语句)的位置不一样,其余的代码完全一样,所以先序和中序会一种,另一种也就会了。ps:先序可以看我上一篇的总结。

方法2 Morris方法

Morris方法是为了将遍历的空间复杂度从 O(h) 降为 O(1),如果对Morris遍历过程有问题的可以看我前一篇先序遍历的总结,这里直接上代码。

public static void inOrderTraverse(TreeNode root) {TreeNode cur = root;TreeNode rightmost = null;while (cur != null) {if (cur.left != null) {rightmost = cur.left;while (rightmost.right != null && rightmost.right != cur) {rightmost = rightmost.right;}if (rightmost.right == null) { // firstrightmost.right = cur;cur = cur.left;} else { // secondrightmost.right = null;System.out.println(cur.val);cur = cur.right;}} else {System.out.println(cur.val);cur = cur.right;}}
}

非递归中序遍历二叉树总结(2种方法)相关推荐

  1. 数据结构之---非递归中序遍历二叉树

    二叉树中序非递归遍历算法实现 大家好,我是逝去的粒子,从今天起,我将尝试着数据结构从0开始学习分享,此篇文章作为试验,一方面可以为自己做笔记防止遗忘,另一方面希望可以帮助大家.不废话,正式开始. 1. ...

  2. 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树

    import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...

  3. 非递归中序遍历二叉树

    中序遍历二叉树(递归) void inOrder(BT* root) {if (root == NULL)return;inOrder(root->lchild);cout << & ...

  4. 非递归先序遍历二叉树总结(3种方法)

    算法 非递归先序遍历二叉树总结(3种方法) @author:Jingdai @date:2020.12.03 传送门 非递归中序遍历二叉树 非递归后序遍历二叉树 递归先序遍历二叉树非常的简单,但是面试 ...

  5. 非递归后序遍历二叉树总结(2种方法)

    算法 非递归后序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.04 传送门 非递归先序遍历二叉树 非递归中序遍历二叉树 方法1 非递归用栈来辅助遍历,后序遍历 ...

  6. 无栈非递归中序遍历非线索化二叉树

    试设计一个非递归算法,按中根顺序遍历非线索二叉树,但不得用任何辅助. 在执行算法期间,允许改变LLINK和RLINK的值. 如何不用辅助栈非递归遍历二叉树呢? 这里给出了一个比较方便的算法,其基本思路 ...

  7. 二叉树非递归后序遍历算法的一种简单思路

    首先从简单的例子开始 1 2 3 上图二叉树的后序遍历序列是"231", 颠倒一下就是"132", 而其前序遍历是"123" 有什么发现? ...

  8. 不用栈实现二叉树非递归中序遍历

    偶尔看到这样一个问题: 有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针. 要求不用递归,中序遍历这棵树.另要求空间复杂度是O(1). 空间复杂度为O(1),摆明就是不让用堆栈模拟递归,所 ...

  9. 二叉树非递归中序遍历

    二叉树的中序遍历 为什么把中序遍历放在最前面呢,因为在非递归遍历中,这个是最简单也是最容易理解的,所以放在第一个的位置. 中序遍历的递归算法很简单,但是想要非递归的实现,就要用到栈这个数据结构, 那么 ...

最新文章

  1. Spring管理Strust的Action
  2. 搜索引擎爬虫蜘蛛的USERAGENT大全
  3. 微信小程序开发-笔记
  4. .NET Core 3.0特性初探:C# 8、WPF、Windows Forms、EF Core
  5. 根据extension field搜索product的技术实现
  6. SSM-网站后台管理系统制作(3)---Google的reCaptcha验证码
  7. SMP IRQ affinity
  8. 永久使用卡巴斯基的方法
  9. 论文中c语言程序的格式,毕业论文程序代码格式_毕业论文范本_论文的标准格式模板...
  10. 用树莓派打拳皇游戏(运行 SWF 游戏文件)【Adobe Flash Player + Chromium】
  11. windows10安装虚拟机virtualbox详细步骤
  12. Webtoos 仿Q+云桌面框架
  13. 无线鼠标时好时坏怎么办
  14. iptables指南删减版
  15. 计算机无法识别平板电脑,平板电脑连接电脑没反应怎么办【图解】
  16. android 设置背景ah,Ahjesus,
  17. ERROR 1819 (HY000) Your password does not satisfy the current policy requirements
  18. 7-4 宿舍谁最高? (20 分) map+结构体的应用
  19. 【操作系统】30天自制操作系统--(9)叠加处理
  20. 升级 phpStudy 中 MySQL 版本

热门文章

  1. Spring 构造器注入
  2. 句子成分-主语/宾语/表语/同位语-4月1号
  3. 编程随想篇(2018夏)
  4. 车队管理全国产化电子元件推荐方案
  5. 中国剩余定理(又称 孙子定理)
  6. 计算机无线模块怎样关闭,开启或关闭计算机的无线网卡
  7. HTML圆和圆角柜形的制作,圆角柜与方角柜的区别
  8. 电视剧 片尾曲 王学兵 - 爱是一场等待
  9. 第三方QQ、微博登陆
  10. explan语句说明