二叉树及其三种遍历方式的实现(基于Java)
二叉树概念:
- 二叉树是每个节点的度均不超过2的有序树,因此二叉树中每个节点的孩子只能是0,1或者2个,并且每个孩子都有左右之分。
- 位于左边的孩子称为左孩子,位于右边的孩子成为右孩子;以左孩子为根节点的子树称其为左子树,右孩子为根节点的子树成为右子树。
- 二叉树可以使用顺序表(数组)来存储其节点,并且节点的存储位置即为数组的下标索引。
遍历:将二叉树中的节点信息由非线性排列变为某种意义上的线性排列,即遍历操作是非线性结构线性化。
结构如图所示:

三种遍历方式:
1.前序遍历
基本思想:首先访问根节点,然后前序遍历其左子树,最后前序遍历右子树。注意:遍历左右子树,依旧使用前序遍历
2.中序遍历
基本思想:首先中序遍历根节点的左子树,然后访问根节点,最后中序遍历其右子树。注意:遍历左右子树,依旧使用中序遍历
3.后序遍历
基本思想:首先后续遍历根节点的左子树,然后后序遍历根节点的右子树,最后访问其根节点。注意:遍历左右子树,依旧使用后序遍历
基于Java代码来实现上述三种遍历方式:
import java.util.List;
public class ArrayBinaryTree<T> {
//一颗二叉树
private T[] arr;
//数据不能为空(数据为空,遍历无意义)
public ArrayBinaryTree(T[] arr){
if(arr == null || arr.length == 0){
throw new IllegalArgumentException("arr must not null");
}
this.arr = arr;
}
//前序遍历
public void preOrder(int index, List<T> result){
result.add(arr[index]);
if(2 * index +1 < arr.length){
preOrder(2 * index +1,result);
}
if(2 * index + 2 < arr.length){
preOrder(2 * index + 2,result);
}
}
//中序遍历
public void infixOrder(int index,List<T> result){
if(2 * index +1 <arr.length){
infixOrder(2 * index + 1,result);
}
result.add(arr[index]);
if(2 * index + 2 < arr.length){
infixOrder(2 * index + 2,result);
}
}
//后序遍历
public void postOrder(int index,List<T> result){
if(2 * index +1<arr.length){
postOrder(2 * index + 1,result);
}
if(2 * index + 2 < arr.length){
postOrder(2 * index +2,result);
}
result.add(arr[index]);
}
}
单元测试:
import java.util.ArrayList;
public class ArrayBinaryTreeTest {
public static void main(String[] args){
Integer[] arr = {1,2,4,3,5,6};
ArrayList<Integer> result = new ArrayList<>(arr.length);
ArrayBinaryTree<Integer> arrayBinaryTree = new ArrayBinaryTree<>(arr);
arrayBinaryTree.preOrder(0,result);
System.out.println(result);
String[] arr1 = {"A","B","C","D","E","F","G","H","I","J"};
ArrayList<String> result_str = new ArrayList<>(arr1.length);
ArrayBinaryTree<String> arrayBinaryTree1 = new ArrayBinaryTree<>(arr1);
arrayBinaryTree1.postOrder(0,result_str);
System.out.println(result_str);
}
}
这里测试了前序遍历和后序遍历,中序遍历可自行测试!结果都正确!!!
测试结果:

至此,关于二叉树的前中后三种遍历方法及其代码实现介绍完毕!!!!!!
二叉树及其三种遍历方式的实现(基于Java)的更多相关文章
- 基于Java的二叉树的三种遍历方式的递归与非递归实现
二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...
- HashMap概述及其三种遍历方式
一.HashMap概述: 1.HashMap是一个散列表,它存储的是键值对(key-value)映射: 2.HashMap继承AbstractMap,实现了Map,Cloneable,Serializ ...
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
树 利用顺序存储和链式存储的特点,可以实现树的存储结构的表示,具体表示法有很多种. 1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置. 2)孩子表示法:把每个结点的孩子排列起来 ...
- Map三种遍历方式
Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...
- Map的两种遍历方式
********************************************************************************* ****************** ...
- 二叉树总结—建树和4种遍历方式(递归&&非递归)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
- lua中for循环的四种遍历方式
lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3 key,value pairs 取每一 ...
- HashMap的两种遍历方式
HashMap的两种遍历方式 HashMap存储的是键值对:key-value . java将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了Hash ...
随机推荐
- 基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 1. MGR简介 | 深入浅出MGR
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1. 为什么是MGR MGR是MySQL Group Replication的缩写,即MySQL组复制. 在以往,我们一般 ...
- PHP代码审计学习-php安全基础
PHP代码审计-php安全基础 php.ini选项 register_globals php>=4.2.0,php.ini 的 register_globals 选项的默认值预设为 Off,当 ...
- 【JDBC】学习路径9-dbcp数据源的使用
第一章:下载 要下载三个东西:commons pool.commons log.dbcp dbcp中有些东西是依赖于commons pool 和 commons log 的. 缺一不可,否则无法正确运 ...
- 【Java】学习路径56-TCP协议 发送、接收
与UDP不同的是,TCP协议使用的是Socket,而不是DatagramSocket,这是要作区分的. 构造Socket对象的时候,可以直接指定ip地址与端口号.此时需要抛出异常. import ja ...
- 【java】学习路径25-ArrayList类,Vector类,LinkedList类的使用和区别,Iterator迭代器的使用
ArrayList的使用 ArrayList类:可变化长度的数组. 与一般的数组不同的是,其长度不固定,可以添加任意类型的数据. 也可以添加不同类型的数据,但是一般不这么做. ArrayList类位于 ...
- Android Module配置C++支持
AndroidStudio提供了创建项目时选择C++支持的模板,但是新建Module的时候并没有C++模板, 要如何配置Module的C++支持呢? 虽然Module没有提供C++模板,但是我们可以手 ...
- 第七十九篇:数组方法(forEach,some,every,reduce)
好家伙,来复习几个数组方法, 1.forEach循环与some循环 代码如下: <script> const arr =['奔驰','宝马','GTR','奥迪'] //forEach循环 ...
- 第七十四篇:Vue组件父子传值
好家伙, 1.组件之间的关系 在项目开发中,组件之间的最常见关系分为如下两种: (1)父子关系 (2)兄弟关系 2.父子之间的数据共享 (1)父->子共享数据 父组件向子组件共享数据需要使用自定 ...
- Ubuntu系统apt添加第三方PPA源
一.前言 1.1目的 在使用Ubuntu时往往apt源会自带很多常用软件,但是大部分都是比较老的版本,本文主要是为了实现以下两个目的: 通过添加第三方的PPA源解决软件版本过低或者没有安装包的情况: ...