二叉树的前序,中序,后序遍历的递归实现

图3-1 示例图

树的遍历方式都多种,其中树的前序,中序,后序遍历方,在原理和代码实现上都有很大相似性,所以放在一块总结。前序,中序,后序这三种遍历方式的不同点在于根节点的遍历的顺序不同。

前序遍历:先输出根节点,在依次前序遍历左子树和右子树。

中序遍历:先中序遍历左子树,在输出根节点,最后中序遍历又子树

后序遍历:先后序遍历左子树,接着后序遍历右子树,最后输出根节点

对于图3-1所示的二叉树而言,三种遍历的结果如下:

前序遍历:1,2,4,5,3,6,7;

中序遍历:4,2,5,1,3,7,6

后序遍历:4,5,2,7,6,3,1

三种遍历方式的递归实现代码如下:

1.前序遍历:

public void PreOrder(TreeNode node){if(node!=null){
System.out.print(node.val)
PreOrder(node.left);
PreOrder(node.right);
}
}

2.中序遍历:

public void InOrder(TreeNode node){if(node!=null){
PreOrder(node.left);
System.out.print(node.val)
PreOrder(node.right);
}
}

3.后序遍历:

public void PostOrder(TreeNode node){if(node!=null){
PreOrder(node.left);
PreOrder(node.right);
System.out.print(node.val)
}
}

从上述的代码中,可以看出递归实现二叉树的遍历代码是相当简介的,三种遍历方式的区别在于节点值输出的时机不同。

四丶二叉树的层次遍历

图4-1

树的层次遍历,是从上往下,从左往右的一种遍历方式,对图4-1所示的树结构而言,其层次遍历的顺序如下:1-2-3-4-5-6-7。

树的层次遍历实现方式和树的前序,中序,后序等遍历方式不同,树的层次遍历利用队列的来实现,而其他三种遍历方式,多用栈和递归的代码来实现。下面利用图的方式来描述下层次遍历的过程,同时给出java代码的实现。

1.将根节点入队,此时队列情况如下

2.判断队列是否为空,如果不空,则出队队首元素(非空,如果为空继续出队,直到非空),并且打印,如图

3.将出队元素的左节点和右节点压入队列中,如图

4.重复步骤2-3,直到2队列为空,循环结束。

对于如图4-1所示的二叉树,其层次遍历的剩余过程如下:

java代码实现的如下:

 public void printLevel(TreeNode root){Queue<TreeNoderoot> queue = new LinkedList<Integer>();queue.add(root);List<Integer>list = new ArrayList<Integer>();while(!queue.isEmpty()){TreeNode node =queue.remove();if(node==null) continue;list.add(node.val);queue.add(node.left);queue.add(node.right);
}
System.out.println(list);
}

通过如上的流程图,对二叉树层次遍历的过程就十分清楚了,在这个过程中,也许存在一个疑惑:在上述过程中,我们对null元素,也进入了入队操作,这个操作为什么不省略的,只对非空的节点入队? 如果我们只需要按照层次遍历的结果,从上往下,从左往右的打印二叉树的元素,那么对非空元素入队是可取的操作,但是节点的层次信息会丢失。比如先要求按照如下格式输出二叉树的层次遍历结果,就必须将非空元素入队,保留节点的层次信息。

[[1],[2,3],[4,5,6],[7]]。

java代码的实现如下:

 public voidprintLevel(TreeNode root){inti=1; //每层应该有多少节点intj=0;//每层的空节点数Queue<Integer>queue= new LinkedList<Integer>();queue.add(root);List<List<Integer>> result = new ArrayList<List<Integer>>();List<Integer>list = new ArrayList<Integer>();while(queue.isEmpty()){TreeNodenode =queue.remove();if(node==null){j++;continue;}list.add(node.val);queue.add(node.left);queue.add(node.right);//如果非空节点数+空节点数=该层节点数,则存储层信息if( i==(list.size()+j) &&list.size()>0 ){List<Integer> temp =new ArrayList<Integer>();//复制链接操作,自己实现copy(temp,list);result.add(temp);list.clear();i=i*2;//节点总数每层倍增j=j*2;//空节点数每层倍增}}System.out.println(result);
}

看图说话之二叉树的前序,中序,后序,层次遍历方式相关推荐

  1. 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...

    二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...

  2. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

  3. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

  4. 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】

    1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...

  5. java数据结构学习笔记-二叉树前、中、后序遍历

    public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...

  6. 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】

    1.前序遍历 #include <iostream> #include <vector> #include <queue> #include <algorit ...

  7. 二叉树前、中、后序线索化及遍历

    public class ThreadedBinaryTree {public static void main(String[] args){Heronodes node1=new Heronode ...

  8. 看图说话实战教程 | 第三节 | 模型构建及训练

    欢迎来到<看图说话实战教程>系列第三节.在这一节中,我们正式进入看图说话深度模型的构建与训练. 文章目录 1. 加载数据 2. 构建模型 3. 拟合模型 4. 完整代码 5. 结束语 1. ...

  9. 序列化和反序列化二叉树 -----前序,中序,后序,层序

    目录 一.序列化和反序列化 1.什么是序列化和反序列化 二.前序遍历 1.序列化 1.问题分析 2.代码实现 2.反序列化 1.问题分析 2.代码实现 三.后序遍历 1.序列化 1.思路分析 2.代码 ...

  10. 谷歌发布最新看图说话模型,可实现零样本学习,多类型任务也能直接上手

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 兴坤 发自 凹非寺 量子位 报道 | 公众号 QbitAI 谷歌新推 ...

最新文章

  1. [转]手游研发数据专业术语科普 游戏热度跟啥有关
  2. IIR+全通滤波器级联实现系统零相位相移_matlab仿真
  3. JavaScript——使用正则表达式提取指定格式内容
  4. 解决在Win2008下IIS7不显验证码的问题
  5. openStack Packages yum upgrade
  6. mysql5.5 replication_mysql5.5 master-slave(Replication)配置
  7. php 如何自动执行脚本文件,使用php作linux自动执行脚本
  8. BootStrap--dropdown
  9. 模拟tomcat连接器
  10. 2021东营高考成绩查询,2021东营市地区高考成绩排名查询,东营市高考各高中成绩喜报榜单...
  11. oracle实际是什么意思,Oracle遇到的应用实际教程
  12. webpack5学习与实战-(十三)-postcss处理css3兼容性前缀
  13. 高效率16KW三相PFC程序方案
  14. Base64 Base32 Base16全家桶
  15. mysql开发技巧笔记
  16. 怎么更改网络中的计算机名字,计算机名称如何更改?电脑的计算机名修改方法...
  17. AI语音机器人有哪些需要注意事项
  18. Andriod基础知识了解一下
  19. r7c刷机android6.0,奇兔刷机全网首发OPPO R7c(电信4G)刷机包 独家支持一键刷机
  20. 软件工程毕业设计选题大全 毕设题目推荐

热门文章

  1. Bloodsucker 【 ZOJ - 3551】
  2. ibatis的isequal_ibatIS中的isNotNull、isEqual、isEmpty
  3. A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstructi
  4. 宏批量替换多个word指定文字
  5. java web安全框架_7.1 SpringSecurity安全框架
  6. hexo博客next主题6.0版本个性化设置
  7. 老徐WEB:js入门学习 - 认识javascript
  8. linux san网络,教你如何DIY SAN存储网络
  9. 短视频系统源码,android 真正的全屏沉浸式体验
  10. LightOJ 1406 Assassin`s Creed