红黑树

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

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

  • 二叉查找树
    特点:左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大。
    缺点:在有序列表的时,二叉查找树退化成一棵链表。

  • 平衡二叉树AVL
    平衡二叉树就是为了解决二叉查找树退化成一棵链表而诞生了,平衡树具有如下特点:
    1、具有二叉查找树的全部特性。
    2、每个节点的左子树和右子树的高度差至多等于1。

  • 红黑树
    为什么有了平衡二叉树还需要红黑树? 因为AVL太严格了。
    平衡树二叉树要求每个节点的左子树和右子树的高度差至多等于1,这个要求实在是太严了,导致每次进行插入/删除节点的时候,几乎都会破坏平衡树的第二个规则,进而我们都需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。
    显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树。
    .
    红黑树的特点
    1.根结点是黑; (上)
    2.每个叶结点是黑; (下)
    3.一个红结点,它的俩个儿子必然都是黑的; (中间)
    4.每一条路径上,黑结点的数目等同。 (从上到下)
    .
    平衡二叉树和红黑树的查找性能:最坏情况下,也是 O ( l o g n ) O(logn) O(logn)
    与平衡树不同的是,红黑树在插入、删除等操作,不会像平衡树那样,频繁着破坏红黑树的规则,所以不需要频繁地调整
    红黑树的各项操作(插入、删除、查找等)复杂度都为log(n)。
    .
    总结:
    二叉平衡树为了解决二叉查找树退化为链表的情况,而红黑树为了解决平衡树在插入、删除等操作需要频繁调整的情况。

2 红黑树有哪些应用场景?

java中的TreeSet,TreeMap,广泛用在C++的STL中。如map和set都是用红黑树实现的。
进程调度。

B-树:文件系统。
B+树:数据库索引。
红黑树:内存中,频繁插入、删除,例如TreeMap,TreeSet(底层是TreeMap)。

3 构建一棵节点个数为 n 的红黑树,时间复杂度是多少?

红黑树各种操作的时间复杂度都是 O ( l o g n ) O(logn) O(logn)

4 红黑树与哈希表在不同应该场景的选择?

参考自:哈希表和红黑树的对比
Hash与红黑树的区别:

权衡三个因素: 查找速度, 数据量, 内存使用,可扩展性,有序性。

hash查找速度会比RB树快,而且查找速度基本和数据量大小无关,属于常数级别;而RB树的查找速度是log(n)级别。并不一定常数就比log(n) 小,因为hash还有hash函数的耗时。当元素达到一定数量级时,考虑hash。但若你对内存使用特别严格, 希望程序尽可能少消耗内存,那么hash可能会让你陷入尴尬,特别是当你的hash对象特别多时,你就更无法控制了,而且 hash的构造速度较慢。

  • 红黑树是有序的,Hash是无序的,根据需求来选择。
  • 红黑树占用的内存更小(仅需要为其存在的节点分配内存),而Hash事先应该分配足够的内存存储散列表,即使有些槽可能弃用
  • 红黑树查找和删除的时间复杂度都是O(logn),Hash查找和删除的时间复杂度都是O(1)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张之海

若有帮助,客官打赏一分吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值