二叉树及其三种遍历方式的实现(基于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 ...
随机推荐
- python jinjia2 使用语法
简介 对于jinjia2来说,模板仅仅是文本文件,可以生成任何基于文本的文件格式,例如HTML.XML.CSV.LaTex 等等,以下是基础的模板内容: <!DOCTYPE html> & ...
- kali的安装与配置
VMware虚拟机与kali下载及安装教程 进入官网https://www.kali.org/get-kali/#kali-platforms 安装kali镜像 需要安装虚拟机 这里我们选择安装VMw ...
- MySQL 数据操纵语句
插入 插入多个字段 insert into grade (`name`) values ('大一'),('大二'),('大三'),('大四'); 修改 设置时间为当前时间 update `studen ...
- 经典设计原则 - SOLID
SOLID 设计原则包含以下 5 种原则: 单一职责原则(Single Responsibility Principle, SRP) 开闭原则(Open Closed Principle, OCP) ...
- C++ UAC 提权 以一个管理员身份运行程序
这里是我编译的和一个测试Demo:http://pan.baidu.com/s/1qWNgC6C 大家如果看我下边的不是很清楚,可以下载这个具体工程: 群:103197177 C++进阶讨论:欢迎喜欢 ...
- Find-Vulnerability 自动化探测扫描工具简介
Fvuln 简介 F-vuln(全称:Find-Vulnerability)是一款自动化探测扫描工具,主要适用于日常安全服务.渗透测试人员和RedTeam红队人员使用 它集合的功能包括: 存活IP探测 ...
- 【java】学习路径43-IO流总结与练习题!
总结 说白了,字节流就是处理类似图片文件.视频文件这些不能直接用记事本打开看的明白的文件. 字符流就是处理可以用记事本直接看的文件. 无论是字节流还是字符流,都有有输入输出两类.(废话) 如果要读取字 ...
- 手把手教你搭建规范的团队vue项目,包含commitlint,eslint,prettier,husky,commitizen等等
目录 1,前言 2,创建项目 2,安装vue全家桶 3,配置prettier 4,配置eslint 5,配置husky + git钩子 6,配置commitlint 6.1,配置commitlint格 ...
- Linux或Docker里安装minio / Docker中安装h5ai
此文为单节点搭建操作 Linux中搭建minio 对象存储服务器 下载minio安装包 wget https://dl.minio.io/server/minio/release/linux-amd6 ...
- 员工离职困扰?来看AI如何解决,基于人力资源分析的 ML 模型构建全方案 ⛵
作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 机器学习实战系列:https://www.showmeai.tech/t ...