一、树概述

树是一种特殊的数据结构,他可以用来描述有分支的结构是由一个或者一个以上的有限集合组成,具有两个属性:一是存在一个特殊的节点,成为树根;二是其余节点分为n>=0个互斥集合,T1,T2,T3,……,Tn,每个集合成为子树。常用属性如下:

1、根节点

根节点是一个没有双亲结点的结点,一棵树中最多有一个根节点。

2、结点的深度

是指从根节点到该节点的路径长度。

3、结点的高度

是指从该节点到最深节点的路径长度。

4、树的高度

是树中所有结点高度的最大值,树的深度是树中所有结点深度的最大值,对于同一棵树,其深度和高度是相同的,但是对于各个结点,其深度和高度不一定相同。

二、二叉树分类

1、二叉树

如果一棵树中的每个结点有0,1或者2个孩子结点,那么这棵树就称为二叉树;空树也是一颗有效的二叉树,一颗二叉树可以看做是由根节点和两棵不相交的子树(分别称为左子树和右子树)组成。

2、满二叉树

二叉树中的每个结点恰好有两个孩子结点且所有叶子结点都在同一层。

3、完全二叉树

完全二叉树从根结点到倒数第二层满足满二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。

4、平衡二叉树

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

5、线索二叉树

通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。所谓的线索二叉树就是把这些所谓的空链加以利用,再指向其他结点,这些连接成为线索,而这个树就成为线索二叉树。

6、红黑树

不仅是具有二叉搜索树的属性,还具有平衡树的属性,有序且子树差不超过1,颜色规则:根节点和特殊节点(即叶节点下面两个虚无的节点和未填写的节点)是黑的,红节点的左右子节点是黑的,最重要的是对于每个节点,从该节点到子孙叶节点的所有路径包含相同数目的黑节点。

三、二叉树代码实现

主要介绍而二叉树的插入、查找、遍历。二叉树的遍历分为如下两类:

(1)深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。可分为前序遍历,中序遍历,后序遍历。

(2)广度优先遍历:从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树的层次。一般借助与队列实现。

1、创建二叉树节点public class Node {

//数据

public int value;

//左子树

public Node leftNode;

//右子树

public Node rightNode;

public Node(int value) {

this.value = value;

leftNode = null;

rightNode = null;

}

}

2、二叉树构造方法public class Tree {

//根节点

private Node root;

//当前节点

private Node currrent;

public Tree(){

root = null;

currrent = null;

}

}

3、插入二叉树/**

* 插入

*/

public void insert(int value) {

Node node = new Node(value);

if (root == null) {

root = node;

currrent = node;

root.rightNode = null;

root.leftNode = null;

return;

}

//当前节点重新指向根节点

currrent = root;

//循环遍历二叉树

while (true) {

if (value < currrent.value) {

//左节点

if (currrent.leftNode == null) {

//左节点设置值

currrent.leftNode = node;

currrent = currrent.leftNode;

return;

} else {

//左节点下面还有节点则向下移动一个节点

currrent = currrent.leftNode;

}

} else {

//右节点

if (currrent.rightNode == null) {

//右节点设置值

currrent.rightNode = node;

currrent = currrent.rightNode;

return;

} else {

//右节点下面还有节点,则向下移动一个节点

currrent = currrent.rightNode;

}

}

}

}

4、查找二叉树/**

* 查找

*/

public int find(int value) {

if (root == null) {

return -1;

} else {

Node current = root;

while (current.value != value) {

if (current.value > value) {

current = current.leftNode;

} else {

current = current.rightNode;

}

if (current == null) {

return -1;

}

}

return current.value;

}

}

5、前序遍历/**

* 前序遍历

*/

public void displayPre(Node root) {

if (root != null) {

System.out.print(root.value + " ");

displayMiddle(root.leftNode);

displayMiddle(root.rightNode);

}

}

6、中序遍历/**

* 中序遍历

*/

public void displayMiddle(Node root) {

if (root != null) {

displayMiddle(root.leftNode);

System.out.print(root.value + " ");

displayMiddle(root.rightNode);

}

}

7、后序遍历/**

* 后序遍历

*/

public void displayLast(Node root) {

if (root != null) {

displayMiddle(root.leftNode);

displayMiddle(root.rightNode);

System.out.print(root.value + " ");

}

}

8、获取根节点/**

* 获取根节点

*/

public Node getRoot() {

return root;

}

9、二叉树是否为空/**

* 判单二叉树是否为空

*/

public boolean isEmpty() {

return root == null;

}

java有内置二叉树_java数据结构——二叉树相关推荐

  1. javascript中的内置对象和数据结构

    文章目录 简介 基础类型 undefined Boolean和Boolean对象 Number和BigInt String Symbol null Object Function Date Array ...

  2. java二叉树是什么_java数据结构二叉树是什么?特点是?

    二叉树是什么?学习java的小伙伴可能经常会听到这个词,但具体是什么又不可知,下面小编就来带你详细了解下二叉树. 二叉树概念 二叉树,指计算机中的一种树结构,这种树结构中每个结点至多只有两个子树,它们 ...

  3. (六)Java关于内置工具类

    Java 内置工具类(String.StringBuffer.LinkedList.ArrayList.HashMap等工具) ​ Java提供了异常丰富的工具类数量巨阳之多,对于 Java学习者而言 ...

  4. java fx 内置图标_DOC-05-01 使用内置的布局面板

    DOC-05-01 使用内置的布局面板 本系列教程主要介绍JavaFX SDK中布局容器相关类,我们称之为面板(Pane).使用布局面板来简化JavaFX应用程序中的用户界面的管理. 我们可以通过为每 ...

  5. pom env.java home_maven 内置pom属性(示例代码)

    内置属性:如 ${basedir} 表示项目根目录 即包含了pom.xml文件的目录 ${version} 表示项目版本 pom属性 ${project.build.sourcedirectory} ...

  6. java 枚举内嵌枚举_Java枚举益智游戏

    java 枚举内嵌枚举 假设我们有以下代码: enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter;priv ...

  7. java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)

    二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...

  8. java数据结构编写二叉树_java 数据结构与算法 BinaryTree二叉树编写

    import java.util.Stack; public class BinaryTree { TreeNode root = null; public BinaryTree() { this.r ...

  9. java构建二叉树_java实现二叉树的构建以及3种遍历方法

    packagetest;importjava.util.LinkedList;importjava.util.List;/*** 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 * * 参考 ...

最新文章

  1. mern技术栈好处?_通过构建运动追踪器应用程序来学习MERN堆栈(MERN教程)
  2. 【Android】Android中判断后台服务是否正在运行
  3. c语言 文件截断,c – 是否有一种正统的方法来避免编译器警告C4309 – “二进制文件输出的”常数值的截断“?...
  4. 我们应该使用什么指标来描述数据中心及其效率?
  5. r语言glmnet包系数显示不全_第一章: R语言介绍
  6. 搭建高吞吐量 Kafka 分布式发布订阅消息 集群
  7. dart系列之:dart优秀的秘诀-隔离机制
  8. 【原】关于AdaBoost的一些再思考
  9. php 获取域名_在PHP中截取当前页面URL地址及URL信息的方法
  10. 用C#搭建IE BHO勾子, 取表单密码
  11. ×××技术详解(二)
  12. jquery中Uncaught TypeError: $(...).ajaxUpload is not a function(…)错误解决方法
  13. 海康SDK方式对接摄像头
  14. 总结oninput、onchange与onpropertychange事件的使用方法和差别
  15. 计算机软件销售适用增值税税率,计算机软件研发企业要交什么税,税率是多少...
  16. WIN10家庭版+ANSYS/AUTODYN安装学习
  17. 80坐标系(3度带)转经纬度
  18. iOS百度地图路径规划功能(对官网文档的理解)
  19. 【Unscented Kalman Filter】C#无迹卡尔曼滤波Demo--两个示例附代码
  20. 《拆掉思维里的墙》—— 读后总结

热门文章

  1. 我最后一年的研究生生活
  2. C++ 常见框架和库
  3. 非 “典型” 研究生的一天
  4. Word控件Spire.Doc 【文本】教程(12) ;新方法在 C# 中获取 Word 文档中内容控件的别名、标签和 ID
  5. reflow(重排/回流)、repaint(重绘)及其优化
  6. JAVASE多人聊天室项目实战
  7. Android 高仿【优酷】圆盘旋转菜单的实现
  8. c语言子函数返回数组,main函数3种方法打印输出
  9. Spring中@Transactional事务回滚(含实例详细讲解,附源码)
  10. 简单实现aside菜单栏折叠 vuex