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)。