l 二叉树的定义

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

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

(a) 为空树。

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

© 是仅有左子树而右子树为空的二叉树。

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

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

排序二叉树特性如下:

(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】,增加节点如果出现不平衡,则通过节点的左旋或右旋,重新平衡树结构,最终平衡二叉树如下图所示:

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

  • 红黑二叉树

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

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

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

  2. 根节点永远是黑色的。

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

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

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

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

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

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

ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。

java数据结构15_二叉树和红黑二叉树相关推荐

  1. java容器之七_TreeMap与红黑二叉树

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  2. 9.6-全栈Java笔记:二叉树和红黑二叉树

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

  3. Java/二叉树,红黑二叉树

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

  4. java 二叉树特点_java学习笔记-二叉树、平衡二叉树(AVL)、红黑二叉树(十)

    各种树 标签:数据结构范畴 二叉树的定义: 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为 ...

  5. 红黑二叉树(附写的源码)

    简单讲一下B树B+树 这些树的作用,主要都体现于增删改查. 而为了性能的增强,从二叉树开始一步步进化,有了有序二叉树,然后到平衡二叉树,然后到了23树. 但23树依然不太优越. 假如有1w的数据,那么 ...

  6. 红黑二叉树的左旋右旋和变色

    小白解析红黑树的基本 什么是红黑树 变色 右旋 什么是右旋呢? 左旋 什么情况下会左旋 什么是红黑树 这就是一个简单的红黑二叉树 红黑二叉树有以下几条基本的规则: 1. 节点分为红色或者黑色. 2.根 ...

  7. 关于红黑二叉树的理解

    最近看了些关于红黑二叉树的博客,有一些自己的见解. 红黑二叉树是一种特殊的平衡二叉树,拥有平衡二叉树的所有特征,这里就不再重复. 红黑二叉树的规则: 1.每个节点都必须有叶子节点(叶子节点没有任何数据 ...

  8. 红黑二叉树原理和分析

    红黑二叉树:防走丢链接 https://blog.csdn.net/lsr40/article/details/85230703

  9. 详解c++---红黑二叉树的原理和实现

    目录标题 什么是红黑二叉树树 红黑树的性质 红黑树的效率分析 红黑树的准备工作 红黑树的insert函数 节点的调整 情况一 情况二 情况三 转换的实现 打印函数 find函数 检查函数 什么是红黑二 ...

最新文章

  1. PHP利用CURL_MULTI实现多线程
  2. 使用分页插件PageHelper
  3. JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令
  4. C++Miller Rabin算法的实现(附完整源码)
  5. C# 通过反射获取方法/类上的自定义特性
  6. Servlet中获取文件在服务器主机的真实路径
  7. 程序员败给了一个厨子,读书无用论让我 必须送书了
  8. win10系统怎么写java_win10系统制作java文本的操作方法
  9. 快速排序总结,Python版
  10. 观察者模式 - dom事件 / 自定义事件 / Promise 我的理解
  11. Linux下QT创建项目错误处理
  12. 关于c# 静态构造函数的说明
  13. Debugview调试视图
  14. 分享几个微信小程序的视频教程
  15. c#中 utm坐标转换经纬度坐标
  16. Python登录豆瓣并爬取影评
  17. 蓝牙耳机的LDAC、aptX指的都是什么?
  18. 用户画像之概念知识!
  19. android root 蓝牙,真正免root的蓝牙一键发送详细使用教程
  20. 阿里技术专家:技术人员如何快速成长,实现职场跃迁?14页ppt干货分享

热门文章

  1. 服务器虚拟化vnc,kvm虚拟机vnc和spice配置
  2. Android 图片网格布局控件
  3. 申请评分卡分析及建模
  4. ZedBoard--(5)嵌入式Linux下的DMA测试(Direct Register Mode)(PS + PL)
  5. windows 用户配置文件复制
  6. 【语音去噪】基于matlab谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】
  7. 基于MySQL 8.0 对事务的深度理解
  8. 5000 万用户、日订单 300 万,下沉市场又出现一个「隐形小巨头」?
  9. ​Deity Microphones 发布Pocket Wireless无线话筒
  10. 深度学习框架PyTorch入门与实践:第二章 快速入门