Java/二叉树,红黑二叉树
二叉树的定义
二叉树是树形结构的一个重要类型。 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
二叉树(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】,增加节点如果出现不平衡,则通过节点的左旋或右旋,重新平衡树结构,最终平衡二叉树如下图所示:
平衡二叉树追求绝对平衡,实现起来比较麻烦,每次插入新节点需要做的旋转操作次数不能预知。
红黑二叉树
红黑二叉树(简称:红黑树),它首先是一棵二叉树,同时也是一棵自平衡的排序二叉树。
红黑树在原有的排序二叉树增加了如下几个要求:
- 每个节点要么是红色,要么是黑色。
- 根节点永远是黑色的。
- 所有的叶节点都是空节点(即 null),并且是黑色的。
- 每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点)
- 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。
这些约束强化了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。这样就让树大致上是平衡的。
红黑树是一个更高效的检索二叉树,JDK 提供的集合类 TreeMap、TreeSet 本身就是一个红黑树的实现。
一个典型的红黑树(浅色表示红色,深色表示黑色)
红黑树的基本操作:插入、删除、左旋、右旋、着色。 每插入或者删除一个节点,可能会导致树不在符合红黑树的特征,需要进行修复,进行 “左旋、右旋、着色”操作,使树继续保持红黑树的特性。
Java/二叉树,红黑二叉树相关推荐
- 图解红黑树及Java进行红黑二叉树遍历的方法
红黑树 红黑树是一种数据结构与算法课堂上常常提到但又不会细讲的树,也是技术面试中经常被问到的树,然而无论是书上还是网上的资料,通常都比较刻板难以理解,能不能一种比较直观的方式来理解红黑树呢?本文将以图 ...
- 9.6-全栈Java笔记:二叉树和红黑二叉树
二叉树的定义 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. ...
- java数据结构15_二叉树和红黑二叉树
l 二叉树的定义 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重 ...
- 红黑二叉树的左旋右旋和变色
小白解析红黑树的基本 什么是红黑树 变色 右旋 什么是右旋呢? 左旋 什么情况下会左旋 什么是红黑树 这就是一个简单的红黑二叉树 红黑二叉树有以下几条基本的规则: 1. 节点分为红色或者黑色. 2.根 ...
- java容器之七_TreeMap与红黑二叉树
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- java 二叉树特点_java学习笔记-二叉树、平衡二叉树(AVL)、红黑二叉树(十)
各种树 标签:数据结构范畴 二叉树的定义: 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为 ...
- 关于红黑二叉树的理解
最近看了些关于红黑二叉树的博客,有一些自己的见解. 红黑二叉树是一种特殊的平衡二叉树,拥有平衡二叉树的所有特征,这里就不再重复. 红黑二叉树的规则: 1.每个节点都必须有叶子节点(叶子节点没有任何数据 ...
- 红黑二叉树原理和分析
红黑二叉树:防走丢链接 https://blog.csdn.net/lsr40/article/details/85230703
- 详解c++---红黑二叉树的原理和实现
目录标题 什么是红黑二叉树树 红黑树的性质 红黑树的效率分析 红黑树的准备工作 红黑树的insert函数 节点的调整 情况一 情况二 情况三 转换的实现 打印函数 find函数 检查函数 什么是红黑二 ...
最新文章
- UI Prototype Design IDE( 界面原型设计工具 )
- java rest框架_比较Java REST文档框架
- Java中的双重检查锁定
- C语言和设计模式(装饰模式)
- Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)
- DDoS攻击重大历史事件
- 当在keil破解时出现的TOOLS.INI_TOOLCHAIN NOT INSTALLED的解决办法。
- Java注释 及 标识符
- L298N模块的使用介绍
- C语言四川麻将算法,四川麻将胡牌算法
- 【JZOJ3337】wyl8899的TLE
- 计算机实验三——Rdt协议对比
- html嵌入播放器,flv视频播放器 Flvplayer.swf 可自动播放参数说明
- 纯css实现文字跳动的动画效果
- (一)egg-基础功能
- confluence 编辑器这次没有加载_推荐一款编辑器然后是R语言的相关性分析
- 秦岭土蜂蜜价格 秦岭土蜂蜜多少钱一斤
- conclution
- 利用katalon进行andriod移动端测试
- yolov3实现之基本处理单元
热门文章
- 可用性测试易用性和有用性_选择您的可用性测试和参与者
- DMA测试(Direct Register Mode)(PS + PL)
- 论倚天屠龙记中继承人问题
- REST 风格 URL
- 浅析web api的json参数校验
- 数字信号处理基础----xilinx除法器IP使用
- 微信跳一跳辅助程序开发,基于C++与opencv图像识别
- 编码以及Python中的编码
- STM32所有系列keil 开发包的下载链接 - Keil.STM32Fxxx_DFP.x.x.x.pack
- 享“瘦”一“夏”,华为运动健康APP智能减脂计划等你来加入