大家都知道二叉树的前序非递归遍历非常好写:

//二叉树的结构
public class TreeNode {TreeNode left;TreeNode right;int val;TreeNode(int val) {this.val = val;left = right = null;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

首先判断根是否为空,将根节点入栈

1.若栈为空,则退出循环 
2.将栈顶元素弹出,访问弹出的节点 
3.若弹出的节点的右孩子不为空则将右孩子入栈 
4.若弹出的节点的左孩子不为空则将左孩子入栈 
5.返回1

void preOrder(){Stack<TreeNode> stack = new Stack<TreeNode>();if (root != null) {stack.push(root);while (!stack.isEmpty()) {root = stack.pop();visit(root);if (root.right != null) {stack.push(root.right);}if (root.left != null) {stack.push(root.left);}}}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

而二叉树的后序非递归遍历就比较难写,因为涉及到判断节点的访问状态…

现在有个很巧妙的方法:

前序:根->左->右 
后序:左->右->根

那么可以把后序当作:根->右->左,然后再反转一下即可。

ArrayList<Integer> postOrder(TreeNode root) {ArrayList<Integer> list = new ArrayList<Integer>();if (root != null) {Stack<TreeNode> stack = new Stack<TreeNode>();stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();list.add(node.val);if (node.left != null) {stack.push(node.left);}if (node.right != null) {stack.push(node.right);}}//反转Collections.reverse(list);}return list;
}

二叉树的后序非递归遍历(巧妙思想)相关推荐

  1. 后序非递归遍历二叉树

    后序遍历的顺序是左.右.根.而前序遍历的顺序是根.左.右.所以只需将前序遍历稍作改变,变成先遍历根再遍历右最后遍历左即(根右左)就会发现此时的顺序便是后序遍历的倒序了,所以这时候只需将改变后的前序遍历 ...

  2. 二叉树的中序非递归遍历

    二叉树的中序非递归遍历 中序遍历的非递归算法描述如下: 从根节点开始检索,如果当前节点不为空,则将当前节点入栈,让当前节点成为其左孩子节点,再继续上一步的操作 加入当前节点为空了,说明其父节点已经没有 ...

  3. C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)

     二叉树的非递归遍历C/C++实现:   非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历struct tree* t ...

  4. 二叉树的前序、中序、后序非递归遍历 python实现

    前言 python中二叉树的定义: class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = None ...

  5. 【我的算法笔记】后序非递归遍历模板及其应用

    目录 前言 非递归后序遍历算法模板 求树的深度 打印值为x的节点的所有祖先 求节点t,s最近公共祖先节点 输出从每个叶子节点到根节点的逆路径 前言 本篇文章主要介绍非递归后序遍历的算法,并且在这个算法 ...

  6. 线索二叉树和中序非递归遍历线索化后的二叉树

    //线索二叉树 #include<stdio.h> #include<malloc.h> #include<process.h> #define OVERFLOW ...

  7. 后序非递归遍历二叉树的应用

    1.打印值为x的结点的所有祖先 栈从0开始,top初始值-1 #include "stdafx.h" #include<iostream> using namespac ...

  8. 二叉树的前、中、后的非递归遍历

    题目 实现一个链式存储的二叉树,采用非递归的形式,按照前.中.后序的顺序遍历二叉树. 代码 /** * 二叉树的前.中.后序的非递归遍历 **/#include <iostream> us ...

  9. 数据结构专题 | 先序非递归遍历二叉树

    先序非递归遍历二叉树,主要是利用了栈的先进后出原理,用一个栈即可实现该算法,下面我们一起来看一下如何来实现吧 目录 先序建立二叉树 先序递归遍历二叉树 先序非递归遍历二叉树 先序建立二叉树 在进行先序 ...

最新文章

  1. 鸿蒙系统方舟运行时,方舟编译器立功!第三方App已经落地,距离鸿蒙系统还会远吗?...
  2. 永恒传奇三服务器维护中,仙境传说ro3月3日5点-10点停服维护
  3. jupyter notebook代码导出_Jupyter Notebook导出包含中文的pdf_亲测有效
  4. Nature发布第一张人类造血干细胞发育的全面路线图
  5. 2021中国企服企业规模化获客体系建设指南
  6. 中国三大运营商发声!要求纽交所复议退市决定
  7. python_numpy_中的matrix与array的区别
  8. 电工模拟接线软件 app_图文详解:户内配电箱的安装及接线方法 ,电气初学者必看!...
  9. 代码实现自动剪辑视频
  10. 科技周刊第十期:自顶向下还是自底向上?
  11. 计算机word表格公开课ppt,word表格制作课件公开课.ppt
  12. vue如何打开pdf文件
  13. 宏基因组数据分析:差异分析(LEfSe安装使用及LDA score计算)
  14. QQ2017熄灭“QQ游戏图标”方法
  15. 五 IP核行业潜在投资方向和机会
  16. 【08月13日】预分红股息率最高排名
  17. html中一些特殊的符号该如何表示
  18. java导出excel 提示文件格式或文件扩展名有误
  19. Deep Lab 系列总结
  20. SSD固态硬盘优化教程

热门文章

  1. 【Python办公自动化】快速将excel按照某列不同的值批量拆分
  2. LeetCode——反转字符串
  3. 系统解剖学 | 神经系统 | 核上瘫和核下瘫
  4. HTTP协议状态码的含义
  5. JZOJ ???? dexterity
  6. Eclipse无法启动
  7. C# HMACSHA1 加密
  8. 网络设备配置与管理(华为)基础系列 20190307
  9. LINUX下 ssdp 实现
  10. 编写Makefile