看图说话之二叉树的前序,中序,后序,层次遍历方式
二叉树的前序,中序,后序遍历的递归实现
图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);
}
看图说话之二叉树的前序,中序,后序,层次遍历方式相关推荐
- 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...
二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...
- java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...
224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...
- C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本
本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...
- 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】
1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...
- java数据结构学习笔记-二叉树前、中、后序遍历
public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...
- 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】
1.前序遍历 #include <iostream> #include <vector> #include <queue> #include <algorit ...
- 二叉树前、中、后序线索化及遍历
public class ThreadedBinaryTree {public static void main(String[] args){Heronodes node1=new Heronode ...
- 看图说话实战教程 | 第三节 | 模型构建及训练
欢迎来到<看图说话实战教程>系列第三节.在这一节中,我们正式进入看图说话深度模型的构建与训练. 文章目录 1. 加载数据 2. 构建模型 3. 拟合模型 4. 完整代码 5. 结束语 1. ...
- 序列化和反序列化二叉树 -----前序,中序,后序,层序
目录 一.序列化和反序列化 1.什么是序列化和反序列化 二.前序遍历 1.序列化 1.问题分析 2.代码实现 2.反序列化 1.问题分析 2.代码实现 三.后序遍历 1.序列化 1.思路分析 2.代码 ...
- 谷歌发布最新看图说话模型,可实现零样本学习,多类型任务也能直接上手
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 兴坤 发自 凹非寺 量子位 报道 | 公众号 QbitAI 谷歌新推 ...
最新文章
- [转]手游研发数据专业术语科普 游戏热度跟啥有关
- IIR+全通滤波器级联实现系统零相位相移_matlab仿真
- JavaScript——使用正则表达式提取指定格式内容
- 解决在Win2008下IIS7不显验证码的问题
- openStack Packages yum upgrade
- mysql5.5 replication_mysql5.5 master-slave(Replication)配置
- php 如何自动执行脚本文件,使用php作linux自动执行脚本
- BootStrap--dropdown
- 模拟tomcat连接器
- 2021东营高考成绩查询,2021东营市地区高考成绩排名查询,东营市高考各高中成绩喜报榜单...
- oracle实际是什么意思,Oracle遇到的应用实际教程
- webpack5学习与实战-(十三)-postcss处理css3兼容性前缀
- 高效率16KW三相PFC程序方案
- Base64 Base32 Base16全家桶
- mysql开发技巧笔记
- 怎么更改网络中的计算机名字,计算机名称如何更改?电脑的计算机名修改方法...
- AI语音机器人有哪些需要注意事项
- Andriod基础知识了解一下
- r7c刷机android6.0,奇兔刷机全网首发OPPO R7c(电信4G)刷机包 独家支持一键刷机
- 软件工程毕业设计选题大全 毕设题目推荐
热门文章
- Bloodsucker 【 ZOJ - 3551】
- ibatis的isequal_ibatIS中的isNotNull、isEqual、isEmpty
- A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstructi
- 宏批量替换多个word指定文字
- java web安全框架_7.1 SpringSecurity安全框架
- hexo博客next主题6.0版本个性化设置
- 老徐WEB:js入门学习 - 认识javascript
- linux san网络,教你如何DIY SAN存储网络
- 短视频系统源码,android 真正的全屏沉浸式体验
- LightOJ 1406 Assassin`s Creed