java 二叉树的实现以及前序、中序、后续遍历实现
目录
- 前言
- 完全二叉树
- 完全二叉树实现代码
- 测试
- 输出
前言
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点。
本文主要讲的是二叉树中的完全二叉树的实现,
完全二叉树
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
简单来说每个节点按照从上往下,从左往右的顺序添加并且每个节点最多只有左右两个节点,就是完全二叉树。
完全二叉树实现代码
简单说明,插入时运用队列来记住插入顺序;遍历时采用递归来遍历。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;public class BinaryTree<T> {/*** 二叉树总的节点数*/private int size;/*** 根节点*/public Node root;/*** 记录插入的队列*/private Queue<Node> queue;public class Node {public T value;private Node leftNode;private Node rightNode;private Node(T value, Node leftNode, Node rightNode) {this.value = value;this.leftNode = leftNode;this.rightNode = rightNode;}}/*** 获取二叉树的总节点数*/public int size() {return size;}/*** 向二叉树中增加节点*/public void add(T addValue) {Node node = new Node(addValue, null, null);if (null == root) {root = node;queue = new LinkedList<>();queue.offer(node);} else {Node queNode = queue.peek();if (null == queNode.leftNode) {queNode.leftNode = node;queue.offer(queNode.leftNode);} else if (null == queNode.rightNode) {queNode.rightNode = node;queue.poll();queue.offer(queNode.rightNode);}}size++;}/*** 前序遍历*/public List<T> preTraverse() {return preTraverse(new ArrayList<>(), root);}private List<T> preTraverse(List<T> list, Node node) {if (list.size() != size && null != node) {list.add(node.value);//遍历左节点preTraverse(list, node.leftNode);//遍历右节点preTraverse(list, node.rightNode);}return list;}/*** 中序遍历*/public List<T> midTraverse() {return midTraverse(new ArrayList<>(), root);}private List<T> midTraverse(List<T> list, Node node) {if (list.size() != size && null != node) {//遍历左节点midTraverse(list, node.leftNode);list.add(node.value);//遍历右节点midTraverse(list, node.rightNode);}return list;}/*** 后序遍历*/public List<T> afterTraverse() {return afterTraverse(new ArrayList<>(), root);}private List<T> afterTraverse(List<T> list, Node node) {if (list.size() != size && null != node) {//遍历左节点afterTraverse(list, node.leftNode);//遍历右节点afterTraverse(list, node.rightNode);list.add(node.value);}return list;}/*** 清空二叉树*/public void clear() {queue = null;size = 0;root = null;}}
测试
public class Main {public static void main(String[] args) {//新建一个二叉树并向其中插入数据BinaryTree<String> binaryTree = new BinaryTree<>();binaryTree.add("A");binaryTree.add("B");binaryTree.add("C");binaryTree.add("D");binaryTree.add("E");binaryTree.add("F");binaryTree.add("G");binaryTree.add("H");binaryTree.add("i");binaryTree.add("j");binaryTree.add("k");binaryTree.add("L");binaryTree.add("M");binaryTree.add("N");binaryTree.add("O");//输出根节点的值BinaryTree.Node root = binaryTree.root;System.out.println(root.value);//输出二叉树总的节点数System.out.println(binaryTree.size());//前序遍历System.out.println(binaryTree.preTraverse());//中序遍历System.out.println(binaryTree.midTraverse());//后序遍历System.out.println(binaryTree.afterTraverse());//清空二叉树binaryTree.clear();}
}
输出
A
15
[A, B, D, H, i, E, j, k, C, F, L, M, G, N, O]
[H, D, i, B, j, E, k, A, L, F, M, C, N, G, O]
[H, i, D, j, k, E, B, L, M, F, N, O, G, C, A]
本文主要讲了java 二叉树的实现以及前序、中序、后续遍历实现,但现实中二叉搜索树却更比较实用,比如用在数据库索引和文件索引的设计中,所以下一篇文章介绍下 java 二叉搜索树的实现以及前序、中序、后续遍历实现
参考:
b+树详解
Linked complete binary tree & its creation
Construct a complete binary tree from given array in level order fashion
完全二叉树插入器
Implementing a Binary Tree in Java
java 二叉树的实现以及前序、中序、后续遍历实现相关推荐
- python数据结构二叉树的前序,中序,后续遍历与推导
根据先序中序求后续 其余同理,多画图就理解了
- 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++
a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...
- 二叉树的构造(前序+中序)---(后序 + 中序)
二叉树的构造(前序+中序)-(后序 + 中序) 思路:要对前序+中序(后序+中序)的构建树的动态过程要了解,思路比较简单,在了解了这个过程之后,理解下面代码就容易了. 过程 参考图: 前序 + 中序: ...
- C++用类实现二叉树的创建,前序中序后序遍历(附完整代码)
C++用类实现二叉树的创建,前序中序后序遍历(附完整代码) 前序.中序.后序遍历 直接上代码 前序.中序.后序遍历 二叉树的遍历分为前序遍历,中序遍历和后序遍历三种遍历方法.前序遍历的顺序为" ...
- 《Java版本二叉树的创建和前序中序后序层次遍历》--递归版本
目录 1.二叉树的递归创建(少说废话,直接上code) 2.二叉树的前序遍历.中序遍历.后续遍历 3.最后贴出所有代码 效果图 1.二叉树的递归创建(少说废话,直接上code) //前序遍历的创建二叉 ...
- 二叉树的前序,中序,后续(非递归版本)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.前序 二.后序 三.中序 总结 前言 二叉树的非递归版本的前序中序后序在面试中也经常考,必须熟练掌握! 下面将会讲 ...
- 二叉树的深度优先搜索, 前序中序后序
深度优先搜索即 depth first search, 简称 DFS 从根节点触发, 沿着路径, 达到最大层次的节点, 然后回退到上一节点, 继续搜索 有前序, 中序, 后序三种方式 前序遍历 根左右 ...
- 【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树
递归先序遍历和中序遍历 先序: void preorder(bnode *t){if(t!=NULL){ visit(t);preorder(t->lchild); preorder(t-> ...
- 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...
后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...
- 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...
最新文章
- Python ORM框架之 Peewee入门
- 【华为云技术分享】MongoDB经典故障系列三:副本集延迟太高怎么办?
- 微软MVC对架构的一点思考
- VB.NET 使用DirectSound9 (3) StreamAudio
- MySQL的InnoDB存储引擎
- arcgis字段计算器赋值_ArcGIS中62个常用应用技巧汇总【必须收藏】
- java获取method_从Method中获取完整类名和方法名
- Python照片隐写术——照片内嵌信息(含模型、测试图片、测试视频)
- Spring进阶(六):can not find proxy: set exposeproxy property on advised to make it available
- SpringBoot注解把配置文件自动映射到属性和实体类实战
- 云时代,网络攻击已经“鸟枪换炮”,你的企业安全还在按兵不动?
- ios开发中各种版本、设备的区分的代码
- 计算机演示题打不开,win7系统电脑上的ppt打不开怎么修复|ppt打不开的四种修复方法...
- 1ms超快响应+144Hz极限刷新 这就是电竞游戏显示器该有的样子
- 能不吃最好别吃:一个食品专业本科生的自白
- 新版标准日本语初级_第四课
- Htm 转换 安卓java_Android开发 Html工具类详解
- 迅捷音频转换器怎么使用? 1
- 数据治理系统解决方案浅析
- 网站客服系统_网页客服系统安装使用_GOFLY在线客服系统
热门文章
- java写抽象类的测试_如何使用JUnit在Java中测试抽象类?
- DIY自己的车载中控(安卓+CAN总线+usb摄像头+GPS导航)-(框架)
- 新浪微博Android客户端学习记录三:完成登录界面和授权界面
- c++读取本地所有USB设备的所有信息(包括串行设备)
- PAT乙级题解1008(超级详细分析,看完就懂)
- STM32机器学习开发实战
- 风控ML[8] | 风控建模常见的数据源有哪些?
- 3大常用PCB设计软件AD、PADS、Allegro应该学哪个?
- 数据结构之二叉树——二叉树的遍历
- Springboot启动出现A component required a bean of type ‘com.xxx‘ that could not问题解决