比较
红黑树不追求"完全平衡",即不像AVL那样要求节点的左右孩子高度差不超过1,它只要求部分达到平衡,就是要求从根节点到叶子节点的最长路径不大于最短路径的两倍。
红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多
就插入节点导致树失衡的情况,AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1)
但在删除节点时导致的失衡,AVL需要维护从被删除节点到根节点root这条路径上所有节点的平衡,旋转的量级为O(logN),而RB-Tree最多只需要旋转3次实现复衡,只需O(1),所以说RB-Tree删除节点的rebalance的效率更高,开销更小!
红黑树能够以O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高
应用
AVL应用场景:Windows NT内核中广泛存在
RBTree:Java的的的中TreeMap中的中的实现,广泛用于C ++的STL中,地图和集都是用红黑树实现的
总结
简单来说,就是看你对这个数据结构的使用要求,如果
应用操作性能主要集中在查询search操作的话,那就应该选择AVL
应用操作性能主要集中delete和insert 的话还是选择RBTree更加具有优势