文章目录

  • 前言
  • 前序遍历
    • 递归
    • 非递归
  • 中序遍历
    • 递归
    • 非递归
  • 后序遍历
    • 递归
    • 非递归
  • 层序遍历
前言

二叉树的遍历有前序遍历、中序遍历、后续遍历、层序遍历。然后我们分别实现一下各种遍历的递归与非递归的方式,树节点定义如下:

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }}
前序遍历

前序遍历是指我们的二叉树先遍历root节点,然后遍历左节点,最后是右节点

递归
public void preOrder(TreeNode root){if (root == null){return;}//输出当前节点的值System.out.println(root.val);//遍历做子树preOrder(root.left);//遍历右子树preOrder(root.right);}
非递归
public void preOrder(TreeNode root){if (root == null){return;}//借助栈先进后出的特性,先将root.right存入,在存入root.leftStack<TreeNode> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()){TreeNode node = stack.pop();System.out.println(node.val);if (node.right != null){stack.push(node.right);}if (node.left != null){stack.push(node.left);}}}
中序遍历
递归
public void midOrder(TreeNode root){if (root == null){return;}//遍历做子树preOrder(root.left);//输出当前节点的值System.out.println(root.val);//遍历右子树preOrder(root.right);}
非递归
public void midOrder(TreeNode root){if (root == null){return;}Stack<TreeNode> stack = new Stack<>();do {//如果左节点一直有,一直压栈while (root != null){stack.push(root);root = root.left;}//出栈,判断是否有右孩子,如果有,就要继续压栈TreeNode node = stack.pop();System.out.println(node.val);if (node.right != null){root = node.right;}}while (root!= null || !stack.isEmpty());}
后序遍历
递归
public void afterOrder(TreeNode root){if (root == null){return;}//遍历做子树preOrder(root.left);//遍历右子树preOrder(root.right);//输出当前节点的值System.out.println(root.val);}
非递归
public void afterOrder(TreeNode root){if (root == null){return;}//借助两个栈来实现,因为要先遍历右孩子才能root节点,所以root节点要在s2的最底部Stack<TreeNode> s1 = new Stack<>();Stack<TreeNode> s2 = new Stack<>();s1.push(root);while (!s1.isEmpty()){TreeNode node = s1.pop();if (node.left != null){s1.push(node.left);}if (node.right != null){s1.push(node.right);}s2.push(node);}while (!s2.isEmpty()){System.out.println(s2.pop().val);}}
层序遍历

层序遍历是指将二叉树的节点一层一层的遍历出来,这里我假设将节点存入list,采用BFS的方式遍历节点。

public List<List<Integer>> levelOrder(TreeNode root) {//存访每一层的结果List<List<Integer>> lists = new ArrayList<>();if (root == null){return lists;}//借助队列存放每一层的节点Queue<TreeNode> queue = new LinkedBlockingQueue<>();queue.add(root);while (!queue.isEmpty()){List<Integer> list = new ArrayList<>();int size = queue.size();//获取当前队列中的所有节点,然后将每个节点的左右孩子放入队列,以提供下层循环输出for (int i = 0; i < size; i++) {TreeNode node = queue.poll();list.add(node.val);if (node.left != null){queue.add(node.left);}if (node.right != null){queue.add(node.right);}}//每一层的list存入listslists.add(list);}return lists;}

二叉树的非递归遍历和递归遍历相关推荐

  1. 刷题:二叉树的非递归遍历方式

    二叉树的非递归的遍历方式 上篇博客记录了二叉树的递归遍历方式以及根据二叉树的遍历结果还原二叉树的内容. 本篇博客记录二叉树的非递归的遍历方式. 二叉树的非递归遍历需要借助栈来实现,而且三种遍历的方式的 ...

  2. 二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度

    文章目录 前言 创建二叉树 先序遍历 中序遍历 后序遍历 获取叶子节点个数 获取树的高度 测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基 ...

  3. 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...

    二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...

  4. 4.二叉树的先序、中序以及后序遍历的递归写法与非递归写法(LeetCode第94、144、145题)

    一.递归法 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是"一看就会,一写就废". 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都 ...

  5. 二叉树层序遍历递归与非递归_总结归纳:二叉树遍历【递归 amp;amp; 非递归】...

    今天为大家总结了二叉树前中后序遍历的递归与迭代解法: 1. 前序遍历 递归 List list=new ArrayList<>();public ListpreOrder(TreeNode ...

  6. 二叉树的非递归遍历(递归和非递归)

    二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅 ...

  7. 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char DataType; #de ...

  8. 二叉树的非递归遍历(c/c++)

    由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...

  9. 创建的二叉树后续非递归遍历结果为_一入递归深似海,从此offer是路人

    前言 今天我们来总结二叉树的前中后序以及层次遍历的递归与非递归的写法.我们都知道二叉树遍历的递归写法很简单,但是面试的时候面试官往往考察的不是我们递归的写法,他们满怀期待你写出非递归的解法,而当你只会 ...

  10. 二叉树遍历的递归、非递归方法(前序、中序、后序,层序)——Java实现

    1. 二叉树的前序遍历(深度优先遍历) 二叉树的节点定义 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(in ...

最新文章

  1. 一句话总结卷积神经网络
  2. Ubuntu 基本概念之美元号的意义
  3. python数字图像处理、色彩空间类型转换_Python+OpenCV图像处理—— 色彩空间转换...
  4. JAVA/PHP/C#版RSA验签--转
  5. 电子计算机技能竞赛数据,2015年浙江省中等职业学校计算机应用技术专业学生职业技能大赛“计算机检测维修与数据恢复”赛项规程.doc...
  6. uboot移植9个步骤_不知道具体的新房装修步骤?9个步骤教你吃透装修
  7. NLP文本相似度 - LCS(最长公共子序列)java代码
  8. 什么!卷积要旋转180度?!
  9. anaconda python下载_anaconda3下载 anaconda python 3.7 for Win64 v2019.10 官方安装免费版 下载-脚本之家...
  10. java 不存在就创建,java怎么实现判断文件是否存在,不存在就创建的方法
  11. vue项目微信分享之后路由链接被破坏怎么办
  12. 在Android中使用自带API操作Json
  13. Anaconda下载安装
  14. linux系统小红帽和ubuntu,Thinkpad trackpoint小红帽和中间键功能的实现。
  15. com alibaba.fastjson.JSONException:witer JavaBean error....
  16. ES6 模板字符串用法
  17. SARS-CoV-2的近端起源
  18. java fastmethod_Java FastMath.cbrt方法代码示例
  19. EXCEL散点图怎么做
  20. #51CTO学院四周年#而立之年的不二之选

热门文章

  1. 导出excel时,弹出的下载窗口一闪而过
  2. Java计算两个时间点的工作日
  3. 车站椅子上密密麻麻的孔,是为了方便放屁吗?
  4. linux版英特尔酷睿i7,英特尔酷睿i7 1165G7和AMD Ryzen 7 Pro 4750U Linux性能对比
  5. 推荐几款好用的企业级文档管理软件
  6. Spark SQL DataFrame新增一列的四种方法
  7. 微信的红包算法 了解一下两种就可以了
  8. 【调剂】陕西师范大学计算机科学学院2022年硕士研究生调剂公告
  9. 超硬核!MySQL优化从执行计划开始(explain超详细)
  10. IE浏览器CSS hack方式一览