二叉树的定义

二叉树是树形结构的一个重要类型。 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
二叉树(BinaryTree)由一个节点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。下图中展现了五种不同基本形态的二叉树。


(a) 为空树。
(b) 为仅有一个结点的二叉树。
© 是仅有左子树而右子树为空的二叉树。
(d) 是仅有右子树而左子树为空的二叉树。
(e) 是左、右子树均非空的二叉树。

注意事项
二叉树的左子树和右子树是严格区分并且不能随意颠倒的,图 © 与图 (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】,增加节点如果出现不平衡,则通过节点的左旋或右旋,重新平衡树结构,最终平衡二叉树如下图所示:

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

红黑二叉树

红黑二叉树(简称:红黑树),它首先是一棵二叉树,同时也是一棵自平衡的排序二叉树。
红黑树在原有的排序二叉树增加了如下几个要求:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点永远是黑色的。
  3. 所有的叶节点都是空节点(即 null),并且是黑色的。
  4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点)
  5. 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。

这些约束强化了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。这样就让树大致上是平衡的。
红黑树是一个更高效的检索二叉树,JDK 提供的集合类 TreeMap、TreeSet 本身就是一个红黑树的实现。
一个典型的红黑树(浅色表示红色,深色表示黑色)

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

Java/二叉树,红黑二叉树相关推荐

  1. 图解红黑树及Java进行红黑二叉树遍历的方法

    红黑树 红黑树是一种数据结构与算法课堂上常常提到但又不会细讲的树,也是技术面试中经常被问到的树,然而无论是书上还是网上的资料,通常都比较刻板难以理解,能不能一种比较直观的方式来理解红黑树呢?本文将以图 ...

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

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

  3. java数据结构15_二叉树和红黑二叉树

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. final,finally,finalize的区别
  2. uboot流程——命令行模式以及命令处理介绍
  3. 【收藏】在QGIS中导入GOOGLE、BING等地图和卫星影像(插件方式和XYZ方式)
  4. 【CentOS 7LAMP架构4】,PHP5和PHP7的安装和配置#171219
  5. MFC获取文件夹下的所有文件名
  6. Kroneker Tensor:克罗内克张量
  7. linux下mongodb 安装,linux下mongodb安装
  8. 创业几乎不要本钱,是创业圈内最大的谎言
  9. oracle中游标详细用法
  10. 【智能路由器】轻量级web服务器lighttpd架设——打造家庭影院
  11. [计算机毕业设计]基于SM9的密钥交换方案的实现与应用
  12. 报表控件FastReport.NET使用教程:如何在 Visual Studio 中使用报表组件
  13. (10)图像增强- -- 图像对比度和亮度调整方法与实现
  14. flask+pytorch部署深度学习(图像识别)项目
  15. 【xyplorer】通过右键新建word文件
  16. 阿里云虚拟机【yum】命令出现错误
  17. NOI2018 退役记
  18. Eclipse 导入maven项目报 Unknown Faceted Project Problem (Java Version Mismatch) 问题解决
  19. 面试:CAS算法原理
  20. Linux网络 IP/TCP校验和、checksum、伪首部相关问题

热门文章

  1. C++ setw() 与 setfill()
  2. 关于 setw()和setfill()函数
  3. B站A站和D站除了这些你还知道哪些字母站?给大家介绍所有字母站(第一期)
  4. k8s--五种控制器类型解析
  5. 理性认知教育机器人寓教于乐的辅助作用
  6. (b)液晶屏是LVDS接口如何实现点屏?
  7. 13.8 - 软件测试工作量及成本估算 3.9 - 软件测试成本估算示例
  8. 加入ASFF,优化yolov5的手与人识别任务
  9. moffiestyle
  10. android 纯代码选项卡,纯javascript实现tab选项卡效果代码