(一)二叉树
相关复杂度:高度为k的二叉树最多有2^k-1,因此如果二叉排序树是平衡的,则n个节点的二叉排序树的高度为log2n+1,其查找效率为O(log2n),近似于折半查找。如果二叉排序树完全不平衡,则其深度可达到n,查找效率为O(n),退化为顺序查找。一般的,二叉排序树的查找性能在O(Log2n)到O(n)之间。(对于二叉排序树,高度决定了查找效率)
1.二叉查找树(BST树)
2.平衡二叉查找树(AVL树)
- 左左插入——左旋
- 右右插入——右旋
- 左右插入——左右旋
- 右左插入——右左旋
除了二叉查找树的一般要求外,还包括了:
1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些性质保证了根节点到任意叶子节点的路径长度,最多相差一半(因为路径上的黑色节点相等,差别只是不能相邻的红色节点个数)
红黑树都既是二叉查找树,也是2-3树。典型的用途是实现关联数组
红黑树背后的思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树。
我们将树中的链接分为两种类型:红链接将两个2-结点连接起来构成一个3-结点,黑链接则是2-3树中的普通链接。确切地说,我们将3-结点表示为由一条左斜的红色链接相连的两个2-结点。
因为每个结点都只会有一条指向自己的链接(从它的父结点指向它),我们将链接的颜色保存在表示结点的Node数据类型的布尔变量color中(若指向它的链接是红色的,那么该变量为true,黑色则为false)。
当我们提到一个结点颜色时,我们指的是指向该结点的链接的颜色。
红黑树能够以O(log2n)的时间复杂度进行搜索、插入、删除操作。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树通过两种手段来实现平衡:改变节点颜色和执行旋转操作。
AVL树和红黑树都是用旋转保持平衡,AVL树对每个插入操作最多需要两次次旋转(单/双旋),对每个删除操作最多需要O(logn)次旋转;而红黑树对每个插入和删除操作,任何不平衡都会在三次旋转之内解决。
如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度。
其次,AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。
map的实现只是折衷了两者在search、insert以及delete下的效率。总体来说,RB-tree的统计性能是高于AVL的。
因此AVL树适用于查找多,删除调整少的情况。综合性能看红黑树是一种比较折中的选择。
参考链接:https://blog.csdn.net/yang_yulei/article/details/26066409
http://www.sohu.com/a/201923614_466939
https://www.cnblogs.com/nullzx/p/6128416.html(对理解性质有帮助)
https://blog.csdn.net/sun_tttt/article/details/65445754
https://blog.csdn.net/gao1440156051/article/details/51581394(红黑树常见面试题)
(二)平衡树(多路)
B树,B+树,B*树,2-3树
AVL树和红黑树适合内部存储应用,B树适合外部存储应用,主要应用于数据库的索引
参考链接:https://www.cnblogs.com/maybe2030/p/4732377.html#_label5
(三)树的应用场景
AVL树:windows对进程地址空间的管理
红黑树:广泛应用与C++STL中,如map和set都是用红黑树实现的
B/B+树:用在磁盘文件组织,数据索引和数据库的索引