平衡二叉树
- 是在二叉排序树上发展而来,
基于二分法
的策略,减少无关数据的检索,大大的提升了数据检索的速度。比二叉排序树效率高
- 特点:
- 非叶子节点最多拥有两个子节点
- 非叶子节值大于左边子节点、小于右边子节点
- 树的左右两边的层级数相差不会大于1
- 没有值相等重复的节点
B树(B-tree)
-
B树和平衡二叉树稍有不同的是B树属于
多叉树
又名平衡多路查找树
(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构。
-
规则:
- 排序方式: 所有节点关键字是按递增次序排列,并遵循左小右大原则
- 子节点数: 非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉)
- 关键字数: 枝节点的关键字数量大于等于
ceil(m/2)-1
个且小于等于M-1
个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2) - 所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子
B+树
- B+树是B树的一个升级版, B+ 树元素自底向上插入。相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。通常用于数据库和操作系统的文件系统中。
- 规则
- B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加
- B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样
- B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针
- 非叶子节点的子节点数=关键字数(这里有两种算法的实现方式,另一种为非叶节点的关键字数=子节点数-1,虽然他们数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现)
- 特点
- B+树的层级更少: 相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快
- B+树查询速度更稳定: B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
- B+树天然具备排序功能: B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
- B+树全节点遍历更快: B+树遍历整棵树只需要遍历所有的叶子节点即可,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。
- B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会要比B+树快。
总结
-
相同思想和策略:
从平衡二叉树、B树、B+树、B*树总体来看它们的贯彻的思想是相同的,都是采用二分法
和数据平衡策略
来提升查找数据的速度。 -
不同方式的磁盘空间利用
不同点:通过IO从磁盘读取数据的原理在不断演变,每一次演变都是为了让节点的空间更合理的运用起来,从而使树的层级减少达到快速查找数据
的目的。
二叉查找(排序)树
- 特点
- 左小右大
- 左右子树也一定分别为二叉排序树
- 可以有值相等的结点(这也是与平衡二叉树的区别)
红黑树
- 它是一种自平衡的二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
- 特点:
- 节点是红色或者黑色
- 根节点是黑色
- 每个叶子的节点都是黑色的空节点(NULL)
- 每个红色节点的两个子节点都是黑色的。
- 从任意节点到其每个叶子的所有路径都包含相同的黑色节点。
- 如果插入数据破坏了红黑树的特性
- 变色: 如果插入结点的过程破坏了红黑树的规则(红结点的两个子节点必须为黑)那么就要把节点红变黑或者黑变红。
- 左旋转 如果一步一步变到最后,全局不符合红黑树特性了,那么就要进行左旋转
- 右旋转之后,如果还是不能满足红黑树的特性,那么就要进行右旋了
- 再变色 右旋之后,还是不行,就需要变色。
- 总结
红黑树很麻烦,但是用的很多,不得不重视!!!