二叉树是我们在程序中用的最多的一种树(个人观点)。最简单的一个二叉树是由一个根节点,两个子节点(一左一右成左右孩子节点)组成。二叉树是数组和链表的结合,即包含了数组的快速查找优点,又包含了链表的快速添加删除的优点。熟练掌握二叉树的遍历方法是很有必要的。下面来介绍一下基于二叉树的四种遍历方式。

  下面我们以一个棵简单的二叉树为例来说明四种遍历:

  

创建树节点类:

    //树节点
class TreeNode {
public char val;
public TreeNode left;
public TreeNode right; public TreeNode(char x) {
val = x;
}
}

  中序遍历:

  先遍历左孩子节点---根节点---右孩子节点

//中序遍历        左-根-右    (前中后:根的位置)
public void InOrder(TreeNode current){
if(current != null) {
InOrder(current.left);
Visit(current);
InOrder(current.right);
}
}

  前序遍历:

  遍历根节点---左孩子节点---右孩子节点

//前序遍历        根-左-右
public void PreOrder(TreeNode current){
if(current != null) {
Visit(current);
InOrder(current.left);
InOrder(current.right);
}
}

  后序遍历:

  遍历左孩子节点---右孩子节点---根节点

    //后续遍历        左-右-根
public void PostOrder(TreeNode current){
if(current != null) {
InOrder(current.left);
InOrder(current.right);
Visit(current);
}
}

  层序遍历:

  同一层节点从左往右依次遍历。

    //层序遍历        同一层节点从左往右依次遍历  FIFO
public void LevelOrder(TreeNode current){
List<TreeNode> q = new ArrayList<TreeNode>();
while(current != null) {
Visit(current);
if(current.left != null) {
q.add(current.left);
}
if(current.right != null) {
q.add(current.right);
}
if(q.isEmpty()) return ;
current = q.remove(0);
}
}

以上就是四种基本遍历方式。下面我们来测试一下,首先写一个工具函数,用来显示当前节点的值。

    //*********辅助工具****************
public void Visit(TreeNode node) {
System.out.print(node.val);
}

写Test测试函数:

  

    @Test
public void fun() {
TreeNode root = new TreeNode('+');
root.left = new TreeNode('-');
root.right = new TreeNode('E');
root.left.left = new TreeNode('*');
root.left.right = new TreeNode('D');
root.left.left.left = new TreeNode('/');
root.left.left.right = new TreeNode('C');
root.left.left.left.left = new TreeNode('A');
root.left.left.left.right = new TreeNode('B'); System.out.println("中序遍历:");
InOrder(root);
System.out.println();
System.out.println("前序遍历:");
PreOrder(root);
System.out.println();
System.out.println("后序遍历:");
PostOrder(root);
System.out.println();
System.out.println("层序遍历:");
LevelOrder(root);
System.out.println();
}

由上面的测试函数得到遍历结果:

全部代码:

package tree;

import java.util.ArrayList;
import java.util.List; import org.junit.Test;
/**
* 二叉数的遍历
* +
* - E
* * D
* / C
* A B
* @author Ranter
*
*/
public class BinaryTree {
@Test
public void fun() {
TreeNode root = new TreeNode('+');
root.left = new TreeNode('-');
root.right = new TreeNode('E');
root.left.left = new TreeNode('*');
root.left.right = new TreeNode('D');
root.left.left.left = new TreeNode('/');
root.left.left.right = new TreeNode('C');
root.left.left.left.left = new TreeNode('A');
root.left.left.left.right = new TreeNode('B'); System.out.println("中序遍历:");
InOrder(root);
System.out.println();
System.out.println("前序遍历:");
PreOrder(root);
System.out.println();
System.out.println("后序遍历:");
PostOrder(root);
System.out.println();
System.out.println("层序遍历:");
LevelOrder(root);
System.out.println();
} //**************************************************************** //中序遍历 左-根-右 (前中后:根的位置)
public void InOrder(TreeNode current){
if(current != null) {
InOrder(current.left);
Visit(current);
InOrder(current.right);
}
}
//前序遍历 根-左-右
public void PreOrder(TreeNode current){
if(current != null) {
Visit(current);
InOrder(current.left);
InOrder(current.right);
}
}
//后续遍历 左-右-根
public void PostOrder(TreeNode current){
if(current != null) {
InOrder(current.left);
InOrder(current.right);
Visit(current);
}
}
//层序遍历 同一层节点从左往右依次遍历(使用队列层序遍历)
public void LevelOrder(TreeNode current){
List<TreeNode> q = new ArrayList<TreeNode>();
while(current != null) {
Visit(current);
if(current.left != null) {
q.add(current.left);
}
if(current.right != null) {
q.add(current.right);
}
if(q.isEmpty()) return ;
current = q.remove(0);
}
} //*********辅助工具****************
public void Visit(TreeNode node) {
System.out.print(node.val);
} //树节点
class TreeNode {
public char val;
public TreeNode left;
public TreeNode right; public TreeNode(char x) {
val = x;
}
}
}

数据结构Java版之遍历二叉树(六)的更多相关文章

  1. 剑指Offer面试题39(Java版):二叉树的深度

    题目:输入一棵二叉树的根节点,求该数的深度. 从根节点到叶结点依次进过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度. 比如.例如以下图的二叉树的深度为4.由于它从根节点到叶结点的最 ...

  2. 数据结构Java版之广度优先图(十三)

    广度优先,则是用的队列,将每一层的节点先存入队列中去,后依次取出队列中的节点,显示与当前节点存在边,但是未被访问过的节点,也就是下一层与之相联系的节点,再将这些节点存入队列.经过层层迭代,就可以完全遍 ...

  3. 数据结构Java版之深度优先-图(十二)

    这里用深度优先遍历存在矩阵里面的图. 深度优先利用的是栈的FIFO特性.为此遍历到底后,可以找到最相邻的节点继续遍历.实现深度优先,还需要在节点加上一个访问标识,来确定该节点是否已经被访问过了. 源码 ...

  4. 数据结构Java版之堆&堆排序(九)

    堆分为大顶堆,和小顶堆. 什么是堆? 堆可以看成是一棵二叉树,二叉树的元素是一个数组不断的从左到右轮训放置.如果是大顶堆,则大的数放上面一层,小的数放下面一层.上一层的数,一定大于下一层的数.小顶堆则 ...

  5. 数据结构Java版之交换算法(一)

    交换的本质是拷贝,其中拷贝包括两种方式.值拷贝和指针拷贝,在java中没有指针,为此,我们可以理解为地址拷贝,在我看来,指针就是地址. 1.传值方式示例: 由上述示例可得,传值,不能起到交换的作用,原 ...

  6. 数据结构Java版之基数排序(四)

    基数排序: 基数排序分为两种:第一种是LSD ,从最低位开始排序, 第二种是 MSD 从最高位开始排.这里介绍第一种LSD排序算法. 首先,我们先了解什么是基数.基数是根据具体的排序情况而定的,比如我 ...

  7. 数据结构Java版之邻接矩阵实现图(十一)

    邻接矩阵实现图,是用一个矩阵,把矩阵下标作为一个顶点,如果顶点与顶点之间有边.那么在矩阵对应的点上把值设为 1 .(默认是0) package mygraph; import java.util.Li ...

  8. 数据结构Java版之邻接表实现图(十)

    邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.u ...

  9. 数据结构Java版之红黑树(八)

    红黑树是一种自动平衡的二叉查找树,因为存在红黑规则,所以有效的防止了二叉树退化成了链表,且查找和删除的速度都很快,时间复杂度为log(n). 什么是红黑规则? 1.根节点必须是黑色的. 2.节点颜色要 ...

随机推荐

  1. Node学习之(第二章:http模块)

    前言 继续上一节的探讨,今天我们来聊聊Node中怎么搭建一个简单的web服务器.平时大家在撸码的过程中,经常需要向服务器发送请求,然后服务器接受请求,响应数据.今天我们就来自己手写一个简单服务器,根据 ...

  2. 使用python库relate搭建LMS学习管理系统

    Relate is an Environment for Learning And TEaching Relate是在 Django上面构建的,可以快速搭建LMS系统,该系统可以方便学习管理和在线课程 ...

  3. M - Ordering Tasks(拓扑排序)

    M - Ordering Tasks Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Descri ...

  4. flask 扩展包

    1.pipenv install python-dotenv  (管理项目环境变量): 2.pipenv install watchdog --dev(监测文件变动,一般开发时使用): 3.pipen ...

  5. Windows 下的常规命令(收藏)

    1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. l ...

  6. springboot项目搭建及常用技术整合

    一.在你建立的工程下创建 Module 选择Spring initializr创建. 二.在Type处选择: Maven Project(项目的构建工具) 三.创建依赖时勾上web,mybatis,m ...

  7. Failed to close the ServletOutputStream connection cleanly, Broken pipe

    Problem1: 服务端报错:Broken pipejava.io.IOException: Connection timed out at sun.nio.ch.FileDispatcherImp ...

  8. python 私有和保护成员变量如何实现?—— "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量;" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  9. 题解 洛谷P2189 【小Z的传感器】

    这题就是考察什么时候建边,貌似和搜索没有半毛钱关系\(qwq\) 首先没有传感器的房间是可以随便走来走去的,因为我们不用考虑顺序.于是就考虑先把这些点的相互的边给建起来. 接下来分析一波,对于第\(i ...

  10. destoon二次开发-用户名、邮箱、手机账号中间字符串以*隐藏 扩展

    因为dt里面有用户名.邮箱.手机账号等,所以想办法进行隐藏保护用户隐私,所以个人就试着写了这个代码. 在api/extend.func.php文件下增加以下代码: //用户名.邮箱.手机账号中间字符串 ...