看完本篇文章希望你能解决以下问题,文章稍长,希望你耐心看完!
- 红黑树也有自旋操作,为什么会比AVL要性能好呢(或者说稳定呢)?
- 红黑树的平衡调整策略?
- 看完能不能手撕红黑树?
1.先来复习复习AVL树
平衡二叉树有很多,最先被发明的平衡二叉树是AVL,是一种高度平衡的二叉查找树;为什么会引入AVL呢?它有什么特别之处呢?
普通的二叉搜索树的时间复杂度在O(logn) ~ O(n),在频繁进行插入、删除可能会出现复杂度退化的情形;也就是在极端情况下,二叉树搜索树退化成了链表
普通的二叉搜索的两种极端情况如下图:
如果是你,你认为应该怎么解决如上问题呢?
其实最核心的一点就是“平衡”,也就是希望节点两边尽可能地保持一致,这样就能保证我们地时间复杂度处于O(logn),因此AVL树帮我们解决了这一个问题。
在AVL树中,任意一个节点的左右子树的高度差的绝对值不会大于1,这是AVL树达到平衡核心性质;虽然AVL树解决了一边倒的情形,但是AVL平衡调整时的左旋和右旋也消耗了一定的性能,所以AVL树应用也不是很广泛。
- 有关AVL树我就不再过多叙述,本章的重点是红黑树。
2.探讨红黑树的魅力
在源码学习过程中,更是到处都是红黑树的影子!!!
红黑树相对于普通的二叉搜索树稍微难了点,那它难在哪呢?主要是在插入和删除时可能会破坏树的平衡性,所以需要进行自适应调整重新达到平衡状态。其实耐下心来看完,发现红黑树也就是那么回事。红黑树是必须要掌握的点,往远了说红黑树使用非常广泛,往近了说很多map类的源码中都用到了红黑树。
先来看红黑树的性质(本质上和2-3树具有等价性想了解的同学可以取看看,对了解B树也有帮助)。
- 1.根节点必须是黑色
- 2.节点非黑即红
- 3.叶子节点是黑色(这个是虚拟节点nil,实际上不存在,就是那个最后一个节点的left和right指向的空)
- 4.两个红色节点不能相连
- 5.根节点到叶子节点,黑色节点数目相同
通过以上的性质你能看出来什么特点没?
- (1)注定了红黑树中最长路径是最短路径的两倍
- (2)红黑树通过树高来控制平衡,也就是(1)所讲的
回到刚开始开头问的问题,为什么红黑树要比AVL更加广泛具有代表性?
红黑树比AVL树的平衡控制条件更加松散;AVL要求左右树差的绝对值必须小于1,这就导致了AVL树在插入和删除之后发生调整的概率要比红黑树要大,而自旋操作又是比较浪费性能的,所以也就导致了控制条件较为松散的红黑树比较吃香。
有的人会问了那控制条件能不能更松散些呢?
需要考虑查询效率和消耗的性能,再松散直接使用链表得嘞。
飞速手撕红黑树中…