关于红黑树,这个名字的来历就说多说了,是Guibas和Sedgewick也算是看了好多遍,但没有一次真正理解过,也没有去实现它。
红黑树满足二叉查找树的所有性质,不同的是它近似平衡,所有的操作都可以在O(lg(n))内完成,所以效率比较高,先列出红黑树的5条性质:
1、每个结点或者是红的,或者是黑的
2、根结点是黑的
3、每个叶子结点是黑的(这里的叶结点是外部结点,貌似只在统计黑结点个数的时候用)
4、如果一个结点是红的,那么它的两个儿子都是黑的(其实也还说明它的父亲结点也是黑的,否则就会存在一个红色结点的儿子是红的)
5、Every simple path from a given node to any of its descendant leaves contains the same number of black nodes(这点用维基上的,感觉导论上的不是很好懂)
插入和删除增加或者减少一个结点,会改变树的结构,为了保证任何一种动态集合上的操作的时间都是O(lg(n)),就需要再插入和删除的过程中做一些调整,这些调整包括对一些结点修改颜色和做旋转。
先看看左旋和右旋(来自导论)
旋转前后各个子树要保持原来的顺序,以下是右旋的代码: