二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了。

后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否访问过右子节点,再来决定是否访问根节点。

思路

1.仍然需要一个栈。将根节点和左节点依次压入栈。

2.peek一个节点,判断其是否有右节点,如果没有则可以弹出该元素。如果有还需判断是否遍历过其右节点,如果有则可以弹出该元素,否则需要将其右节点压入栈。将右节点视为根节点重复步骤一。

代码

public static List postorderTraversal(TreeNode root) {List a = new ArrayList<>();Stack stack = new Stack<>();if (root == null) {return a;}TreeNode last = null;TreeNode cur = root;while (!stack.isEmpty() || cur != null) {//根节点和左节点压入栈while (cur != null) {stack.push(cur);cur = cur.left;}TreeNode peek = stack.peek();//将peek的元素判断其是否有右节点或者右节点为访问过的节点if (peek.right == null || peek.right == last) {peek = stack.pop();a.add(peek.val);last = peek;cur = null;} else {cur = peek.right;}}return a;}

其实我们发现只有思路清晰,其实后序遍历的非递归实现并不困难。然鹅这道题在LeetCode上算是困难的题目,可见它的含金量还算可以的。

The    end

Cool Coding

喜欢就关注我,和我一起玩吧~

二叉树后序遍历_二叉树后序遍历非递归实现相关推荐

  1. 给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

    给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出.要求除该树本树的存储空间外只能使用固定量的额外存储空间,且过程中不得修改该树,即使是暂时的修改也不允许. (算法导 ...

  2. java 先序遍历_二叉树的前序中序后序遍历(java代码)

    importjava.util.*; public classtraversal { public static voidmain(String[] args) { List list=newArra ...

  3. java实现二叉树的后序遍历_二叉树前序中序后序遍历(Java实现)

    基于对数组和链表的存储优缺点分析,这里按照需求引进了一种新的数据结构,树 它可以在增删改查上都保持高效率 创建如下图所示的二叉树,并分别使用三种顺序遍历: 代码实现: package Tree; pu ...

  4. Java二叉树逆序遍历_二叉树遍历小结

    二叉树遍历小结 声明 0 二叉树遍历概述 二叉树遍历:按照既定序,对每个节点仅访问一次: 二叉树非递归遍历思想:参考这篇博文,核心思想是存在重合元素的局部有序保证整体有序,由于二叉树的结构特点,二叉树 ...

  5. java非递归遍历file树_Java语言实现非递归实现树的前中后序遍历总结

    前言 三种遍历的递归写法都很好写,所以总结一下非递归写法. 先贴一张图复习一下三种遍历方式就进入正文啦~ [注:本文所有代码实现中树的结点定义如下: public class Node { int v ...

  6. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

  7. 多叉树的前序遍历_二叉树的非递归遍历的思考

    封面图来自wikipedia 1 简介 二叉树的深度优先遍历(前序遍历.中序遍历.后序遍历)是一个比较基本的操作.如果使用递归的做法,很容易写出相应的程序:而如果使用非递归的做法,虽然也能写出相应的代 ...

  8. resultset不支持循环遍历_二叉树的各种遍历方法的简单解释

    二叉树顾名思义,最多两个孩子. 一般规定一个二叉树,因为节点间有相互连接的原因,所以只要给定根节点,那么顺着寻找左孩子和右孩子便可以遍历到所有的节点,这就是遍历的直观解释. 而遍历分为深度遍历和广度遍 ...

  9. java实现二叉树广度优先遍历_二叉树之深度优先和广度优先遍历(Java)

    tree.png 1. 二叉树结构定义 public static class Tree { int data; Tree left; Tree right; public Tree(int data ...

最新文章

  1. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)
  2. 基于引擎的matlab+vc混合编程的配置
  3. android eclipse 环境
  4. 中科院罗平演讲全文:自动撰写金融文档如何实现,用 AI 解救“金融民工” | CCF-GAIR 2017
  5. 【Scratch】青少年蓝桥杯_每日一题_5.01_画三五七边型
  6. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
  7. 浅谈Fluent Ribbon 中的SplitButton
  8. android mysql 乱码_android POST数据遇到的UTF-8编码(乱码)问题解决办法
  9. mvc各层简单清晰的描述
  10. MVC利用URLRoute实现伪静态后正真的静态html无法访问
  11. 转载:SharePoint技术资料
  12. HDU 4946 Area of Mushroom(2014 Multi-University Training Contest 8)
  13. 【图像压缩】基于matlab GUI DCT图像压缩(压缩率可调)【含Matlab源码 1049期】
  14. Windows下mysql5.7修改root密码
  15. 【引语收集计划】《启迪》 本雅明--导言-瓦尔特.本雅明 : 1892-1940 by汉娜.阿伦特
  16. 整理任正非思想:英雄好汉站出来-1995
  17. python堆栈溢出的原因_堆栈溢出一般是什么原因?
  18. Ubuntu-基础指令汇总
  19. linux更新网卡驱动版本,Linux中升级网卡驱动
  20. 一看就会的Redist数据持久化之AOP

热门文章

  1. java 自定义注解 生成json_Jackson 通过自定义注解来控制json key的格式
  2. ionic 配置java_Ionic 项目配置环境
  3. 【LeetCode】【HOT】104. 二叉树的最大深度(BFS+队列/递归)
  4. Luogu P2733 家的范围 Home on the Range
  5. UVA - 10779 Collectors Problem
  6. WCF添加服务失败一则
  7. 存储过程,游标和触发器实例
  8. 学习第六天@Linq操作
  9. 汉字与区位码(2) - 分析
  10. 历史上的昨天和今天(zz)