我们在前面的章节中讲述了平衡二叉查找树,也就是叶节点高度差的绝对值不超过 1,并且左右两个子树都是一颗平衡树。最早被发明的是平衡二叉查找树是 AVL 树,后面红黑树才被发明。
AVL 树在每次的插入和删除时都要进行调整,会比较耗时。所以 AVL 树就不适合应用于频繁插入、删除的数据集。至于红黑树,在这方面相较于 AVL 树会有一些优势,其在插入、删除、查找等各种操作的性能都比较稳定。对于工程应用,需要面对各种异常情况,为了支撑工业级的应用,我们会更加倾向于使用性能更为稳定的红黑树。
红黑树之所以会被叫做这个名称,是因为其在每个结点上增加了一个存储位表示结点的颜色,可以是 RED 或者 BLACK。通过对任何一条从根到叶子的路径上各个着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。所以,红黑树能保证在最坏情况下,基本操作的运行时间为 O(logN)。在实际场景中,Java 的 HashMap、TreeMap、TreeSet 等均使用了红黑树进行数据的存储的。
红黑树在实际工程中应用如此广泛,那么为什么红黑树会有这样的优势呢,接下来由我给大家一一道来。
1. 红黑树的性质
红黑树也叫做 R-B Tree(Red-Black Tree),是一种不怎么严格的平衡二叉查找树。为了防止有些同学对平衡二叉查找树的定义有些遗忘,我们再回顾一下平衡二叉查找树。