Java 二叉树后序遍历(递归/非递归)

简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。

设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有几种情况:DLR(称为先序遍历),LDR(称为中序遍历),LRD (称为后序遍历),层次遍历。

后序遍历

后序遍历:首先遍历左子树,然后遍历右子树,最后访问根结点。

如图所示二叉树的后序遍历结果为:[8,9,4,15,7,20,3]

代码实现

递归方式

public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();postorder(root, res);return res;
}public void postorder(TreeNode root, List<Integer> res) {if (root == null) {return;}postorder(root.left, res);postorder(root.right, res);res.add(root.val);
}

非递归方式

public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();if (root == null) {return res;}Deque<TreeNode> stack = new LinkedList<TreeNode>();TreeNode prev = null;while (root != null || !stack.isEmpty()) {while (root != null) {stack.push(root);root = root.left;}root = stack.pop();if (root.right == null || root.right == prev) {res.add(root.val);prev = root;root = null;} else {stack.push(root);root = root.right;}}return res;
}

完整代码:

public static void main(String[] args) {TreeNode root = new TreeNode(3);TreeNode n1 = new TreeNode(9);TreeNode n2 = new TreeNode(20);TreeNode n3 = new TreeNode(8);TreeNode n4 = new TreeNode(15);TreeNode n5 = new TreeNode(7);TreeNode n6 = new TreeNode(4);root.left = n1;root.right = n2;n1.right = n3;n2.left = n4;n2.right = n5;n4.left = n6;List<Integer> rs = postorderTraversal(root);System.out.println("递归中序遍历结果:" + rs);rs = postorderTraversal02(root);System.out.println("非递归中序遍历结果:" + rs);
}// 递归
public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();postorder(root, res);return res;
}public void postorder(TreeNode root, List<Integer> res) {if (root == null) {return;}postorder(root.left, res);postorder(root.right, res);res.add(root.val);
}// 非递归
public List<Integer> postorderTraversal02(TreeNode root) {List<Integer> res = new ArrayList<Integer>();if (root == null) {return res;}Deque<TreeNode> stack = new LinkedList<TreeNode>();TreeNode prev = null;while (root != null || !stack.isEmpty()) {while (root != null) {stack.push(root);root = root.left;}root = stack.pop();if (root.right == null || root.right == prev) {res.add(root.val);prev = root;root = null;} else {stack.push(root);root = root.right;}}return res;
}

运行结果:

Java 二叉树后序遍历(递归/非递归)相关推荐

  1. c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)

    五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...

  2. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

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

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

  4. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

  5. 详细图解二叉树中序遍历(非递归C++)LeetCode94

    详细图解二叉树中序遍历(非递归) 二叉树中序递归含义 LeetCode题目94 详细图解 源代码 运行结果 二叉树中序递归含义 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树.若二叉树为空则结 ...

  6. 二叉树后序遍历的非递归算法

    二叉树的后序遍历的非递归算法与二叉树的先序和中序遍历的非递归算法相比稍微复杂一点. 大致思路是:如果当前结点左右子树均为空,则可以访问当前结点,或者左右子树不均为空,但是前一个访问的结点是当前结点的左 ...

  7. Java二叉树后序遍历:递归与迭代

    二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树:左子树和右子树又同样都是二叉树. 如下便是一棵二叉树: 二叉树的后序遍历方式为: 1. 如果根节点有左 ...

  8. LeetCode 145 二叉树的后序遍历(非递归)

    题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1.使用一 ...

  9. 二叉树的后序遍历的非递归实现算法

    算法思想: 后序遍历二叉树的顺序是左右根.我们需要用一个辅助栈来记录没有访问过得祖宗节点. 借助一个简单的二叉树模拟一下过程. 后序遍历的顺序是DEBFGCA 算法步骤 1.沿着根的左孩子,依次入栈, ...

最新文章

  1. 最简android之wifi调试
  2. vue下拉框值改变_vue select下拉框绑定值不跟着变问题
  3. voip 音频采集时间_数字音频基础------从PCM说起
  4. P3100-[USACO14JAN]建造滑雪场【贪心,dp】
  5. 宝塔linux网络连接错误,宝塔linux面板部署防火墙后网页打不开报http564错误的解决办法...
  6. 零售券商之王:零佣金的罗宾侠的400亿美金
  7. 人工智能面试问题整理
  8. 机器学习之线性回归(机器学习基石)
  9. Safari浏览器中 视频倍速播放
  10. C#第九天面向对象的学习
  11. 在IT呆了好久了,给大家科普下这个行业的行话
  12. 帮助机器人自由行走 思岚科技推出激光导航模块
  13. linux终端联网网速慢,解决ubuntu 上网速度慢的问题
  14. Spring Security 密码加密器 Pbkdf2PasswordEncoder 、 BCryptPasswordEncoder
  15. 干货 | 七年留美经验,帮你省钱自助游美国
  16. 个人对系统拆分的理解
  17. Echarts 开源,免费商用图表控件使用整理
  18. MySQL 简单查询记录(二)
  19. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十一):反向传播笔记
  20. Java常见的一些面试题目

热门文章

  1. igraph/networkx学习笔记之一 —— 数据结构
  2. 网页版电子书城购物系统(含github代码!!)
  3. 局域网steam联机_适合和基友联机一起玩的单机游戏(1)
  4. Lenovo Thinkpad T400在BIOS中开启VT虚拟化后无法生效?
  5. Android开源优秀项目源码
  6. 一次全国竞赛笔试时的试题
  7. 轮播图详解(完整代码在最后)
  8. 基于Https协议返回Jason字符串
  9. 受限玻尔兹曼机和深度置信网络
  10. vue下载和预览word