迭代形式的前中后序遍历

前序遍历

LeetCode:前序遍历
节点入栈出栈顺序:1,2,3入栈,3出栈,2出栈,4入栈,4出栈,1出栈,5入栈,5出栈,6入栈,6出栈
前序遍历结果序列为:1 -> 2 -> 3 -> 4 -> 5 -> 6
节点入栈时将其加入到前序遍历结果序列。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();if (root == null) {return ans;}Deque<TreeNode> d = new ArrayDeque<>();d.addLast(root);ans.add(root.val);root = root.left;while (!d.isEmpty() || root != null) {if (root == null) {root = d.pollLast().right;// System.out.println(root);} else {d.addLast(root);// System.out.println(1);ans.add(root.val);root = root.left;}}return ans;}
}

中序遍历

LeetCode:中序遍历
节点入栈出栈顺序:1,2,3入栈,3出栈,2出栈,4入栈,4出栈,1出栈,5入栈,5出栈,6入栈,6出栈
中序遍历的结果为:3,2,4,1,5,6
节点出栈时将其加入到中序遍历结果序列

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();if (root == null) {return ans;}Deque<TreeNode> d = new ArrayDeque<>();d.addLast(root);root = root.left;while (root != null || !d.isEmpty()) {if (root != null) {d.addLast(root);root = root.left;} else {root = d.pollLast();ans.add(root.val);root = root.right;}}return ans;}
}

后序遍历

LeetCode:后序遍历
后序遍历比前序遍历和后序遍历稍微特殊一点,后序遍历中每一个节点在第一次出栈并不会真正的出栈,而是往栈中压入一个标记变量(二次入栈),在访问到标记变量的时候,将它的下一个节点出栈并加入到后序遍历结果序列中。
节点入栈出栈顺序:1,2,3入栈,标记变量,3出栈,标记变量,4入栈,标记变量,4出栈,2出栈,标记变量,5入栈,标记变量,6入栈,标记变量,6出栈,5出栈,1出栈
后序遍历的结果为:3,4,2,6,5,1
节点在二次出栈时将其加入到后序遍历结果序列

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();if (root == null) {return ans;}Deque<TreeNode> d = new ArrayDeque<>();d.addLast(root);root = root.left;while (root != null || !d.isEmpty()) {if (root == null) {TreeNode r = d.peekLast();if (r.val == -100000) {// System.out.println(d.pollLast().val);d.pollLast();ans.add(d.pollLast().val);continue;}// System.out.println(d.size());d.addLast(new TreeNode(-100000));if (r.right != null) {d.addLast(r.right);root = r.right.left;}} else {d.addLast(root);root = root.left;}}return ans;}
}

实际上,前中后序遍历的本质是一样,就是要遍历完整颗树,不同的是生成结果的规则。

栈实现二叉树的前中后序遍历相关推荐

  1. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

    二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...

  2. Java二叉树的前中后序遍历

    Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...

  3. 数据结构之二叉树的前中后序遍历以及层序遍历

    学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...

  4. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)

    文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...

  5. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  6. 二叉树的前中后序遍历(考试常考)

    二叉树遍历的概念 二叉树的遍历是按某种规则对二叉树的每个节点均只被访问一次,根据根节点访问位置的不同分为三种:先序遍历(根左右).中序遍历(左根右).后序遍历(左右根).         由于树是通过 ...

  7. (必背)二叉树的前中后序遍历(利用栈)

    二叉树的前序遍历(利用栈) 1.首先将根节点压入栈 2.栈中的首元素出栈,然后先将其右节点压入栈中,再将栈中的左节点压入栈中(如果左右节点分别存在的话) 3.重复步骤2直到栈为空 class Solu ...

  8. 二叉树的前中后序遍历(栈)(C++)

    二叉树的遍历是很基础的东西,用递归是很简洁明了的写法,但是栈的写法也可以了解一下 #include<vector> #include<stack> struct TreeNod ...

  9. 二叉树的前中后序遍历之迭代法(统一风格迭代方式)

    一.前序遍历(迭代法)->右左中 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子. 为什么要先加入 右孩子,再加入左孩子呢?因为这样出栈的时候 ...

  10. Java~二叉树的前中后序遍历的几种方式(递归法,迭代法,标记法等)

    目录 一.结点的定义 二.递归法遍历二叉树 前序遍历 中序遍历 后序遍历 三.迭代(非递归)遍历二叉树 (1).迭代模拟法 前序遍历 中序遍历 后序遍历 (2).空指针标记法 前序遍历 中序遍历 后序 ...

最新文章

  1. 全球首届APMCon,带你给“应用性能”把把脉
  2. 自动控制理论及matlab,自动控制理论及MATLAB实现
  3. java正则过滤特殊字符
  4. JavaScript动画:offset和匀速动画详解(含轮播图的实现)
  5. 打印hello world java_java – 如何打印“hello world”?
  6. pads中如何设置等长_标签打印软件中标签间距以及边距如何设置
  7. Python 字符串、列表、字典 操作方法大全 正则re
  8. oracle 模拟 mysql,mysql通过表和function模拟oracle的sequence
  9. 使用opencv人脸识别对比两张人脸图片
  10. 基于LDC1000的自动循迹小车
  11. java实现给图片添加水印
  12. 彗星通行证的积分规则是什么?
  13. C语言数码管是共阴共阳程序,成功C DIY 单片机(2)51单片机直接驱动共阴极数码管...
  14. System.gc()的理解
  15. JS Array.slice 截取数组的实现方法
  16. 使用图像播放Java中的一种技巧-搜索图像,将图像转换为文本,隐藏数据
  17. ZLG CANalyst驱动安装报错
  18. 你离心想事成只差一个计划 | 进击
  19. nyoj 145 聪明的小珂
  20. LiveUpdate(自动更新)经验

热门文章

  1. c语言试题 函数选择,(C语言函数章节选择题.doc
  2. 广告机CE认证 FCC认证费用构成
  3. 主流数据库之MySQL函数和MySQL数据操作基础知识及示例
  4. 如何实施一个BI项目(附项目管理模板)
  5. 学习笔记:基于模型的协同过滤推荐算法简述
  6. adb连接手机显示:List of devices attached
  7. 如何禁止树莓派屏幕休眠
  8. 432考研_贾俊平《统计学》第1章 导论思维导图
  9. Opencv+opencv_contrib安装
  10. 云课堂智慧php函数测验,云课堂智慧职教答案查询