各种树

标签:数据结构范畴

二叉树的定义:

二叉树是树形结构的一个重要类型。 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。

二叉树(BinaryTree)由一个节点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。下图中展现了五种不同基本形态的二叉树。

(a) 为空树。

(b) 为仅有一个结点的二叉树。

(c) 是仅有左子树而右子树为空的二叉树。

(d) 是仅有右子树而左子树为空的二叉树。

(e) 是左、右子树均非空的二叉树。

二叉树的左子树和右子树是严格区分并且不能随意颠倒的,图 (c) 与图 (d) 就是两棵不同的二叉树。

排序二叉树特性如下:

(1) 左子树上所有节点的值均小于它的根节点的值。

(2) 右子树上所有节点的值均大于它的根节点的值。

比如:我们要将数据【14,12,23,4,16,13, 8,,3】存储到排序二叉树中,如下图所示:

排序二叉树本身实现了排序功能,可以快速检索。但如果插入的节点集本身就是有序的,要么是由小到大排列,要么是由大到小排列,那么最后得到的排序二叉树将变成普通的链表,其检索效率就会很差。 比如上面的数据【14,12,23,4,16,13, 8,,3】,我们先进行排序变成:【3,4,8,12,13,14,16,23】,然后存储到排序二叉树中,显然就变成了链表,如下图所示:

平衡二叉树(AVL):

为了避免出现上述一边倒的存储,科学家提出了“平衡二叉树”。

在平衡二叉树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。 增加和删除节点可能需要通过一次或多次树旋转来重新平衡这个树。

节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。

比如,我们存储排好序的数据【3,4,8,12,13,14,16,23】,增加节点如果出现不平衡,则通过节点的左旋或右旋,重新平衡树结构,最终平衡二叉树如下图所示:

平衡二叉树追求绝对平衡,实现起来比较麻烦,每次插入新节点需要做的旋转操作次数不能预知。

红黑二叉树:

红黑二叉树(简称:红黑树),它首先是一棵二叉树,同时也是一棵自平衡的排序二叉树。

红黑树在原有的排序二叉树增加了如下几个要求:

每个节点要么是红色,要么是黑色。

根节点永远是黑色的。

所有的叶节点都是空节点(即 null),并且是黑色的。

每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点)

从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。

这些约束强化了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。这样就让树大致上是平衡的。

红黑树是一个更高效的检索二叉树,JDK 提供的集合类 TreeMap、TreeSet 本身就是一个红黑树的实现。

红黑树的基本操作:插入、删除、左旋、右旋、着色。 每插入或者删除一个节点,可能会导致树不在符合红黑树的特征,需要进行修复,进行 “左旋、右旋、着色”操作,使树继续保持红黑树的特性。

java 二叉树特点_java学习笔记-二叉树、平衡二叉树(AVL)、红黑二叉树(十)相关推荐

  1. java程序伪代码_Java学习笔记——伪代码及程序控制

    开学刚刚一个月,学习Java也已经有三周. 老师给了下面的实验题目: 某教师需要一个学生成绩计算应用程序.每个学生总评成绩是由平时成绩.期中成绩.期末成绩 和其它成绩组成,其所占比例为:平时成绩30% ...

  2. java 字符串赋值_Java 学习笔记(二)变量

    标识符  标识符就是名字.类名,变量名,方法名,参数名等  标识符的命名规则  以字母.下划线或美元符号$开头,不能以数字开头 其后可以是字母.数组或美元符号$ 区分大小写 避免使用关键字  ...

  3. java 调用弗雷_JAVA 学习笔记

    封装: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法实现对隐藏信息的操作和访问,保证了数据的安全性.(可以隐藏类的细节,方便修改) 封装的实现步骤: 1.修改属性的可见性: ...

  4. java日期类型_Java 学习笔记 (三) Java 日期类型

    以下内容摘自:  https://www.cnblogs.com/crazylqy/p/4172324.html import java.sql.Timestamp; import java.text ...

  5. JAVA翻译官_Java学习笔记之——Java介绍

    1.Java体系: JavaSE:标准版,其他两个体系的基础 JavaEE:企业版 JavaME:微型版,适用于消费类型的微型设备 2.Java三大特性:封装.继承.多态 3.Java的特点:面向对象 ...

  6. java jcf查看_Java学习笔记——JCF集合框架

    List基本使用 特别是有顺序,所有可以用get(i)读取出来 public static void main(String[] args) { //1.List基本使用 List lst = new ...

  7. java嵌套循环语句_Java学习笔记(七) 循环语句

    一.for循环语句 1.1 循环结构 循环结构的组成: 初始语句:用于表示循环开启的起始状态,简单说就是循环开始的时候什么样 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行 ...

  8. java 静态成员 创建_Java学习笔记11---静态成员变量、静态代码块、成员变量及构造方法的初始化或调用顺序...

    当创建一个对象时,各种成员变量及构造方法的初始化或调用顺序是怎样的呢? (1).如果类尚未加载,则先初始化静态成员变量和静态代码块,再初始化成员变量,最后调用相应的构造方法: (2).如果类已经加载过 ...

  9. java算法优化_Java学习笔记---Java简单的代码算法优化(例)

    例:用一张1元纸币兑换1分.2分.5分硬币,要求兑换50枚硬币,求出所有组合. package mypackage01; public class demo { public static void ...

最新文章

  1. 为什么在CSDN中同时打开两个Markdown编辑窗口会相互干扰?
  2. Highmaps网页图表教程之Highmaps第一个实例与图表构成
  3. python 生意参谋_GitHub - iOSDevLog/sycm: 生意参谋
  4. access 导入 txt sql语句_[内附完整源码和文档] 基于C#和Access的智能聊天机器人
  5. weblogic ejb_使用Oracle WebLogic对应用程序外部的EJB的引用
  6. EDGE浏览器配合阿呆喵设置广告过滤
  7. LDA主题模型简介及Python实现
  8. Linux设备中的并发控制
  9. 【Hard 递归 动态规划 回文串15】LeetCode 730. Count Different Palindromic Subsequences
  10. 基(là)础(jī)线段树详解
  11. 运动matlab分析机械振动,《运用Matlab分析机械振动》-毕业论文.doc
  12. 15个最流行的GitHub机器学习项目
  13. 树莓派运行python命令_《树莓派Python编程入门与实战》——2.2 使用Raspbian命令行...
  14. CSDN上传资源无法设置积分了吗
  15. 裁员1700人,IBM 声称内部调整团队;谷歌将以26亿美元全现金收购Looker,绝对大手笔...
  16. ORACLE 考试的流程
  17. 也许是史上最全的一次CDN详解
  18. jsBlob数据转为图片
  19. 你想过逃离上海吗?不用4小时
  20. ionic3 ion-select

热门文章

  1. 出现ORA-01034: ORACLE not available ORA-27101错误
  2. 身体气味与菌群——病因和管理
  3. 使用phpstudy8.0集成环境
  4. JMDM-2011 投币刷卡一体式自动售水机控制系统
  5. android kotlin 高阶函数,Kotlin-高阶函数
  6. 【二代示波器教程】第12章 示波器设计—DAC信号发生器的实现
  7. 无人(自动)驾驶知识概述
  8. 用RANSAC算法实现干扰严重的直线拟合~
  9. 在线PDF格式转换器推荐,小圆象PDF转换器满足您的办公需求
  10. 荣耀30什么时候升级鸿蒙,荣耀30手机4.0后什么时候开始才可以升级鸿蒙?