0
点赞
收藏
分享

微信扫一扫

面试让你手撕红黑树?30张图带你彻底理解红黑树~


看完本篇文章希望你能解决以下问题,文章稍长,希望你耐心看完!

  • 红黑树也有自旋操作,为什么会比AVL要性能好呢(或者说稳定呢)?
  • 红黑树的平衡调整策略?
  • 看完能不能手撕红黑树?

1.先来复习复习AVL树

平衡二叉树有很多,最先被发明的平衡二叉树是AVL,是一种高度平衡的二叉查找树;为什么会引入AVL呢?它有什么特别之处呢?

普通的二叉搜索树的时间复杂度在O(logn) ~ O(n),在频繁进行插入、删除可能会出现复杂度退化的情形;也就是在极端情况下,二叉树搜索树退化成了链表

普通的二叉搜索的两种极端情况如下图:

面试让你手撕红黑树?30张图带你彻底理解红黑树~_平衡二叉树


面试让你手撕红黑树?30张图带你彻底理解红黑树~_elasticsearch_02


如果是你,你认为应该怎么解决如上问题呢?

其实最核心的一点就是“平衡”,也就是希望节点两边尽可能地保持一致,这样就能保证我们地时间复杂度处于O(logn),因此AVL树帮我们解决了这一个问题。

在AVL树中,任意一个节点的左右子树的高度差的绝对值不会大于1,这是AVL树达到平衡核心性质;虽然AVL树解决了一边倒的情形,但是AVL平衡调整时的左旋和右旋也消耗了一定的性能,所以AVL树应用也不是很广泛。

  • 有关AVL树我就不再过多叙述,本章的重点是红黑树。


2.探讨红黑树的魅力

在源码学习过程中,更是到处都是红黑树的影子!!!

红黑树相对于普通的二叉搜索树稍微难了点,那它难在哪呢?主要是在插入和删除时可能会破坏树的平衡性,所以需要进行自适应调整重新达到平衡状态。其实耐下心来看完,发现红黑树也就是那么回事。红黑树是必须要掌握的点,往远了说红黑树使用非常广泛,往近了说很多map类的源码中都用到了红黑树。

先来看红黑树的性质(本质上和2-3树具有等价性想了解的同学可以取看看,对了解B树也有帮助)。

  • 1.根节点必须是黑色
  • 2.节点非黑即红
  • 3.叶子节点是黑色(这个是虚拟节点nil,实际上不存在,就是那个最后一个节点的left和right指向的空)
  • 4.两个红色节点不能相连
  • 5.根节点到叶子节点,黑色节点数目相同

面试让你手撕红黑树?30张图带你彻底理解红黑树~_平衡二叉树_03

通过以上的性质你能看出来什么特点没?

  • (1)注定了红黑树中最长路径是最短路径的两倍

面试让你手撕红黑树?30张图带你彻底理解红黑树~_elasticsearch_04

  • (2)红黑树通过树高来控制平衡,也就是(1)所讲的

回到刚开始开头问的问题,为什么红黑树要比AVL更加广泛具有代表性?

红黑树比AVL树的平衡控制条件更加松散;AVL要求左右树差的绝对值必须小于1,这就导致了AVL树在插入和删除之后发生调整的概率要比红黑树要大,而自旋操作又是比较浪费性能的,所以也就导致了控制条件较为松散的红黑树比较吃香。

有的人会问了那控制条件能不能更松散些呢?

需要考虑查询效率和消耗的性能,再松散直接使用链表得嘞。



飞速手撕红黑树中…


举报

相关推荐

0 条评论