平衡二叉树、红黑树、B树、B+树总结

平衡二叉树(AVL树)

平衡二叉树具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

作用:当原序列有序时,提高搜索效率。

平衡因子:平衡二叉树中不存在平衡因子大于 1 的节点。在一棵平衡二叉树中,节点的平衡因子只能取 0 、1 或者 -1。

最小失衡子树:在新插入的结点向上查找,以第一个平衡因子的绝对值超过 1 的结点为根的子树称为最小不平衡子树。也就是说,一棵失衡的树,是有可能有多棵子树同时失衡的。而这个时候,我们只要调整最小的不平衡子树,就能够将不平衡的树调整为平衡的树。失衡调整主要是通过旋转最小失衡子树来实现的。

四种插入方式旋转情况

1、A的左孩子的左子树插入节点(LL)

 

2、A的右孩子的右子树插入节点(RR)

 

3、A的左孩子的右子树插入节点(LR)

 

4、A的右孩子的左子树插入节点(RL)

 

删除操作

插入操作后只需要对插入栈中的弹出的第一个非平衡节点进行修正,而删除操作需要修正栈中的所有非平衡节点。

四种情况:

删除叶子节点、删除的节点只有左子树、删除的节点只有右子树、删除的节点既有左子树又有右子树

B树

 B树的创建就是为了优化数据库查找。

调整成B树结构如下:

一颗m阶的B树定义如下:

1、每个结点最多有m-1个关键字。

2、根结点最少可以只有1个关键字。

3、非根结点至少有Math.ceil(m/2)-1个关键字。

4、每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。

5、所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。

B+树

1、单一节点存储更多的元素,使得查询的IO次数更少。(非子叶结点都存放的是索引,只有叶子结点才带有卫星数据;而B树的每个节点都有卫星数据,那这样B+树的结点会多出空间来放元素,也意味着B+树比B树还要矮胖);

2、所有查询都要查找到叶子节点,查询性能稳定。(B树最好的情况是根结点就是结果,最坏是叶子结点;而B+树的数据都要在叶子结点中的卫星数据获取)

3、所有叶子节点形成有序链表,便于范围查询。(如果想查询一个范围,B树的时间复杂度要比B+树高很多)

红黑树

红黑树是一种自平衡二叉查找树,主要是为了解决二叉查找树多次插入新节点而导致的不平衡提出。

红黑树的查找、删除、添加操作都为log(n)。

红黑树近似平衡:深度最大的节点的深度<= 2 * 深度最小的节点的深度。

应用:Linux进程调度、HashMap、TreeMap、C++中的map和set、epoll在内核中的实现(用红黑树管理事件块)、nginx(用红黑树管理timer)。

性质

性质1:节点是红色或黑色。
性质2:根节点是黑色。
性质3:每个叶节点是黑色。
性质4:每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5:从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
原文地址:https://www.cnblogs.com/kingshine007/p/11379279.html