本文作者:帅地

公众号:苦逼的码农

红黑树算是很难的一种数据结构吧,一般很少考察插入删除等具体操作步骤,如果遇到要你手写红黑树的面试官,就直接告辞吧。所以,更多是会考察你对红黑树的理解程度,考察的最多的估计就是为什么有了二查找查找树/平衡树还需要红黑树这个问题了,今天,你只需要花一分钟的时间,就知道怎么回答这个问题了。

1、二叉查找树的缺点

二叉查找树,相信大家都接触过,二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图


二分查找的思想,快速找到某个节点。n 个节点的二叉查找树,正常的情况下,查找的时间复杂度为 O(logn)。

之所以说是正常情况下,是因为二叉查找树有可能出现一种极端的情况,例如


二叉查找树的条件,然而,此时的二叉查找树已经近似退化为一条链表,这样的二叉查找树的查找时间复杂度顿时变成了 O(n),可想而知,我们必须不能让这种情况发生,为了解决这个问题,于是我们引申出了平衡二叉树

2、平衡二叉树

平衡二叉树就是为了解决二叉查找树退化成一颗链表而诞生了,平衡树具有如下特点

1、具有二叉查找树的全部特性。

2、每个节点的左子树和右子树的高度差至多等于1。

例如:图一就是一颗平衡树了,而图二则不是(节点右边标的是这个节点的高度)



平衡树基于这种特点就可以保证不会出现大量节点偏向于一边的情况了。关于平衡树如何构建、插入、删除、左旋、右旋等操作这里不在说明,具体可以看我之前写的一篇文章:【漫画】以后在有面试官问你AVL树,你就把这篇文章扔给他。

于是,通过平衡树,我们解决了二叉查找树的缺点。对于有 n 个节点的平衡树,最坏的查找时间复杂度也为 O(logn)。

3、为什么有了平衡树还需要红黑树?

虽然平衡树解决了二叉查找树退化为近似链表的缺点,能够把查找时间控制在 O(logn),不过却不是最佳的,因为平衡树要求每个节点的左子树和右子树的高度差至多等于1,这个要求实在是太严了,导致每次进行插入/删除节点的时候,几乎都会破坏平衡树的第二个规则,进而我们都需要通过左旋右旋来进行调整,使之再次成为一颗符合要求的平衡树。

显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树,红黑树具有如下特点:

1、具有二叉查找树的特点。

2、根节点是黑色的;

3、每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存数据。

4、任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的。

5、每个节点,从该节点到达其可达的叶子节点是所有路径,都包含相同数目的黑色节点。

例如下面的图片(注意,图片中黑色的、空的叶子节点没有画出)(图片来自极客时间)


正是由于红黑树的这种特点,使得它能够在最坏情况下,也能在 O(logn) 的时间复杂度查找到某个节点。至于为什么就能够保证时间复杂度为 O(logn),我这里就不细讲了,后面的文章可能会讲。

不过,与平衡树不同的是,红黑树在插入、删除等操作,不会像平衡树那样,频繁着破坏红黑树的规则,所以不需要频繁着调整,这也是我们为什么大多数情况下使用红黑树的原因。

不过,如果你要说,单单在查找方面的效率的话,平衡树比红黑树快。

所以,我们也可以说,红黑树是一种不大严格的平衡树。也可以说是一个折中发方案。

如果我上面讲的,你都懂,都能够在面试中说出来,应该是足够的了。我当时就是这么回答的。

4、总结

所以,最后的答案是,平衡树是为了解决二叉查找树退化为链表的情况,而红黑树是为了解决平衡树在插入、删除等操作需要频繁调整的情况。

不过,红黑树还有挺多其他的知识点可以考,例如红黑树有哪些应用场景?向集合容器中 HashMap,TreeMap 等,内部结构就用到了红黑树了。还有构建一棵节点个数为 n 的红黑树,时间复杂度是多少?红黑树与哈希表在不同应该场景的选择?红黑树有哪些性质?红黑树各种操作的时间复杂度是多少?

如果你把这些都弄懂了,应该就差不多可以的了,后面有时间的话,我给大家详细讲一下这些题,这里最好是要求理解,而不是死记硬背。

●无处不在的「单例设计模式」

●我们都知道的「字典」,到底可以用来做什么?

●曾经,我被这些陷阱坑的找不着北...

●直到面试被问到什么是「共享引用」,我才发现对于它的一无所知...

?扫描上方二维码即可关注

腾讯面试题:有了二叉查找树、平衡树为啥还需要红黑树?相关推荐

  1. 有了二叉查找树、平衡树为啥还需要红黑树?

    参考文章: 有了二叉查找树.平衡树为啥还需要红黑树? 漫画AVL树 谢谢作者分享!

  2. 拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?

    之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢. 而红黑树在插入新数据后可能需要通过左旋,右旋. ...

  3. 浅谈二叉查找树、AVL树、红黑树、B树、B+树的原理及应用

    一.二叉查找树 1.简介 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: 任意节点左子树不为空,则左子树的值均小于根节点的值. 任意节点右子树不为空,则右子树的值 ...

  4. 红黑树:自平衡的二叉查找树

    前一篇博文中写道,二叉查找树是一种具有较高性能的符号表实现,在理想情况下它可以保证查找.插入和删除操作的时间复杂度在对数级别.二叉查找树可以动态地插入和删除元素,在插入和删除操作的过程中,二叉查找树的 ...

  5. 二叉查找树与红黑树原理和程序全面介绍

    转载请注明出处 http://blog.csdn.net/yankai0219/article/details/8273542 学习方法:我主要是参考算法导论以及Nginx中rbtree.h和rbtr ...

  6. 最新腾讯面试题汇总--C++后端开发岗(部分含答案)

    阻塞.非阻塞.同步.异步 的区别 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu 不会给线程分配时间片,即线程暂停运行).函数只有在得到结果之后才会返 ...

  7. android获取指针空间大小_腾讯笔试题:浅谈计算机中cpu位数和指针

    来一个腾讯笔试题 在刷题的时候看到了腾讯笔试题的这个问题 long a = (long)(((int *) 0) + 4);printf("%ld ",a); 请问输出 a 的值是 ...

  8. 腾讯面试题:char 和 varchar的最大长度是多少,以及他们之间的区别(看完你就能和面试官笑谈人生了)

    title: 腾讯面试题:char 和 varchar的最大长度是多少,以及他们之间的区别(看完你就能和面试官笑谈人生了) tags: 面试常见题 腾讯面试题:char 和 varchar的最大长度是 ...

  9. 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了)

    title: 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了) tags: 面试常见题 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了) 腾讯面试题:创建索 ...

最新文章

  1. SPIFFS文件系统移植–基于STM32F407
  2. GDCM:gdcm::VR的测试程序
  3. [html] HTML与XHTML二者有不同
  4. IBM DS300 安装
  5. 基于LINQ to SQL的WEB开发三层架构(2)
  6. docker mysql 主从配置
  7. HDU2039 三角形【水题】
  8. 让你页面速度飞起来的前端性能优化方案
  9. iOS动画之模拟音量振动条
  10. 量化投资入门指南:投资组合构建模型和执行模型
  11. flex java blazeds_Flex同Java通信--BlazeDS入门图文详解(上)
  12. 选择html5抛弃flash,谷歌Chrome年底正式抛弃Flash 全面转向HTML5
  13. shell命令查阅端口信息_Powershell 执行外部命令
  14. 《东周列国志》第六十五回 弑齐光崔庆专权 纳卫衎宁喜擅政
  15. 乔治华盛顿大学计算机科学专业,乔治华盛顿大学计算机专业简介
  16. macbook linux 双系统,mac安装linux双系统的吐槽
  17. 大数据查询工具HBase读写设计与实践
  18. Android背光系统实现
  19. Java是什么?我们为什么要学习Java?
  20. 做人的六原则 40条心计 共勉

热门文章

  1. Android系统10 RK3399 init进程启动(三十八) 属性Selinux实战编程
  2. Unity 简单手势识别
  3. 敏捷领导力——组织敏捷转型的脚手架(Scaffolding)模型解析
  4. 深入原理64式:26 python知识总结
  5. 手机镜头参数--手机摄影训练营第五期---S05-20170605
  6. 获得淘口令真实url (item_password)
  7. 磁带库加入新磁带(backup exec)
  8. 有计算机信息高新技术考试合格证,待遇怎么样?
  9. Linux----知识储备
  10. 对计算机的态度作文,人工智能改变了生活态度作文