红黑树和AVL树的比较
这篇文章不是对红黑树和AVL树基本理论的讲解,更多的是关注为何红黑树和AVL树相比较的优缺点。读者应该之前就已经了解到红黑树和AVL树的相关基础知识。
AVL树
AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度差最多为1,所以它也被称为高度平衡树。
AVL树的定义:
一棵AVL树需要满足以下的条件:
1. 它的左子树和右子树都是AVL树
2. 左子树和右子树的高度差不能超过1
AVL树的性质:
- 一棵n个结点的AVL树的其高度保持在O(log2(n)),不会超过3/2log2(n+1)
- 一棵n个结点的AVL树的平均搜索长度保持在O(log2(n)).
- 一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为O(log2(n)).
- 一棵n个结点的AVL树插入一个结点做平衡化旋转所需要的时间为O(log2(n)).
AVL树插入节点或者删除节点时平衡恢复所需要的时间
AVL树在插入一个节点时,从“插入点到根节点”路径上的各节点都有可能改变平衡状态。但是在平衡调整的过程中,我们只需要调整其中平衡状态被改变的最深的那个节点就可以保证该节点以上的路径都能够保持平衡。平衡旋转的调整操作主要就是通过左旋,右旋来调整的。
因而插入操作需要O(lg(n))的遍历时间以及至多两次旋转的常数时间。
AVL树在删除一个节点时,首先需要先进行普通二叉查找树的删除操作。然后沿着被删除的节点自下而上的调整实际删除节点的父节点到根节点之间的子树的平衡状态。注意,删除操作不同于插入操作时,只需要调整最深的不平衡子树的节点,而是需要不断上溯并判断是否需要调整,直到根节点。因而,AVL树的一次删除操作可能需要若干次旋转才能恢复平衡状态。
因而删除操作需要O(lg(n))的遍历时间以及若干次旋转的常数时间;
总的来说,AVL树的插入和删除都只需要O(lg(n))的时间,只是其常系数量不同。
红黑树
红黑树同样是一种自平衡平衡二叉查找树,红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
红黑树的定义
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树的特性:
每个结点或者为黑色或者为红色。
根结点为黑色。
每个叶结点(实际上就是NULL指针)都是黑色的。
如果一个结点是红色的,那么它的两个子节点都是黑色的。
对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点数量必须相同。
红黑树的定理
定理:一棵含有n个节点的红黑树的高度至多为2log(n+1).
红黑树的特性5确保没有一条路径会比其他路径长出两倍。因而,红黑树是相对是接近平衡的二叉树
红黑树插入节点或者删除节点时平衡恢复所需要的时间
红黑树是大致平衡的二叉查找树。
红黑树能够以O(log2n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决(插入最多只需要两次,删除最多需要三次)。
红黑树是牺牲了严格的高度平衡的优越条件为代价红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高.
红黑树的应用
其最常用的用途就是实现关联数组。Java中的TreeMap,TreeSet,以及C++ SAL中的map,set,multimap,multiset。底层都是通过红黑树来实现的。
除此之外,Linux内核中PCB,进程控制块的管理也是通过红黑树来管理的。
为什么红黑树的统计性能优于AVL树?
如果插入一个node引起了树的不平衡,AVL和红黑树都是最多只需要2次旋转操作,以及O(logN)的遍历时间。但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从实际被删node的父节点到root这条路径上所有node的平衡性,因此需要若干次的旋转以及O(logN)的遍历时间。而红黑树最多只需3次旋转,以及O(logN)的遍历时间。
其次,AVL的结构相较红黑树来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,红黑树在需要大量插入和删除node的场景下,效率更高。
由于AVL高度平衡,因此AVL的search效率更高。红黑树的查询性能略微逊色于AVL树,因为他比AVL树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的avl树最多多一次比较,
STL map,set的实现只是折衷了两者在search、insert以及delete下的效率。总体来说,红黑树的统计性能是高于AVL的。