1.简介
红黑树是一种自平衡二叉查找树,它的统计性能要好于平衡二叉树(AVL树),它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:它可以在 O(log n)时间内做查找,插入和删除等操作。
2.红黑树的性质:
总的来说,红黑树是一种满足以下五个性质的二叉查找树:
性质1:每个节点是红的或者黑色
性质2:根是黑色
性质3:所有叶子都是黑色(叶子是NIL节点)
性质4:如果一个节点是红的,则它的两个儿子都是黑的
性质5:从任意一个节点到其叶子的所有简单路径都包含相同数目的黑色节点。
这五个性质强制了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。为什么呢?我们从性质4可以知道,任何一个简单路径上不能有两个毗邻的红色节点。这样,最短的可能路径全是黑色节点,最长的可能路径有交替的红色和黑色节点。同时根据性质5,我们知道,所有最长的可能路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。
这里我们以Java中的TreeMap为例,结合详细的图解,讲解下红黑树(Red-Black tree)的查找、插入、删除的过程。
Java的TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的顺序,也可以通过构造时传入的比较器(Comparator)。
出于性能原因,TreeMap是非同步的(not synchronized),如果需要在多线程环境使用,需要程序员手动同步;或者通过如下方式将TreeMap包装成(wrapped)同步的:
SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
这里说下旋转的概念:
当查找树的结构发生改变时,红黑树的条件可能被破坏,需要通过调整使得查找树重新满足红黑树的条件。调整可以分为两类:一类是颜色调整,