目录

  • 前言
  • 完全二叉树
  • 完全二叉树实现代码
    • 测试
    • 输出

前言

二叉树是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 二叉树的实现以及前序、中序、后续遍历实现相关推荐

  1. python数据结构二叉树的前序,中序,后续遍历与推导

    根据先序中序求后续 其余同理,多画图就理解了

  2. 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++

    a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...

  3. 二叉树的构造(前序+中序)---(后序 + 中序)

    二叉树的构造(前序+中序)-(后序 + 中序) 思路:要对前序+中序(后序+中序)的构建树的动态过程要了解,思路比较简单,在了解了这个过程之后,理解下面代码就容易了. 过程 参考图: 前序 + 中序: ...

  4. C++用类实现二叉树的创建,前序中序后序遍历(附完整代码)

    C++用类实现二叉树的创建,前序中序后序遍历(附完整代码) 前序.中序.后序遍历 直接上代码 前序.中序.后序遍历 二叉树的遍历分为前序遍历,中序遍历和后序遍历三种遍历方法.前序遍历的顺序为" ...

  5. 《Java版本二叉树的创建和前序中序后序层次遍历》--递归版本

    目录 1.二叉树的递归创建(少说废话,直接上code) 2.二叉树的前序遍历.中序遍历.后续遍历 3.最后贴出所有代码 效果图 1.二叉树的递归创建(少说废话,直接上code) //前序遍历的创建二叉 ...

  6. 二叉树的前序,中序,后续(非递归版本)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.前序 二.后序 三.中序 总结 前言 二叉树的非递归版本的前序中序后序在面试中也经常考,必须熟练掌握! 下面将会讲 ...

  7. 二叉树的深度优先搜索, 前序中序后序

    深度优先搜索即 depth first search, 简称 DFS 从根节点触发, 沿着路径, 达到最大层次的节点, 然后回退到上一节点, 继续搜索 有前序, 中序, 后序三种方式 前序遍历 根左右 ...

  8. 【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树

    递归先序遍历和中序遍历 先序: void preorder(bnode *t){if(t!=NULL){ visit(t);preorder(t->lchild); preorder(t-> ...

  9. 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...

    后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...

  10. 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

    二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...

最新文章

  1. Python ORM框架之 Peewee入门
  2. 【华为云技术分享】MongoDB经典故障系列三:副本集延迟太高怎么办?
  3. 微软MVC对架构的一点思考
  4. VB.NET 使用DirectSound9 (3) StreamAudio
  5. MySQL的InnoDB存储引擎
  6. arcgis字段计算器赋值_ArcGIS中62个常用应用技巧汇总【必须收藏】
  7. java获取method_从Method中获取完整类名和方法名
  8. Python照片隐写术——照片内嵌信息(含模型、测试图片、测试视频)
  9. Spring进阶(六):can not find proxy: set exposeproxy property on advised to make it available
  10. SpringBoot注解把配置文件自动映射到属性和实体类实战
  11. 云时代,网络攻击已经“鸟枪换炮”,你的企业安全还在按兵不动?
  12. ios开发中各种版本、设备的区分的代码
  13. 计算机演示题打不开,win7系统电脑上的ppt打不开怎么修复|ppt打不开的四种修复方法...
  14. 1ms超快响应+144Hz极限刷新 这就是电竞游戏显示器该有的样子
  15. 能不吃最好别吃:一个食品专业本科生的自白
  16. 新版标准日本语初级_第四课
  17. Htm 转换 安卓java_Android开发 Html工具类详解
  18. 迅捷音频转换器怎么使用? 1
  19. 数据治理系统解决方案浅析
  20. 网站客服系统_网页客服系统安装使用_GOFLY在线客服系统

热门文章

  1. java写抽象类的测试_如何使用JUnit在Java中测试抽象类?
  2. DIY自己的车载中控(安卓+CAN总线+usb摄像头+GPS导航)-(框架)
  3. 新浪微博Android客户端学习记录三:完成登录界面和授权界面
  4. c++读取本地所有USB设备的所有信息(包括串行设备)
  5. PAT乙级题解1008(超级详细分析,看完就懂)
  6. STM32机器学习开发实战
  7. 风控ML[8] | 风控建模常见的数据源有哪些?
  8. 3大常用PCB设计软件AD、PADS、Allegro应该学哪个?
  9. 数据结构之二叉树——二叉树的遍历
  10. Springboot启动出现A component required a bean of type ‘com.xxx‘ that could not问题解决