1.红黑树介绍
二叉搜索树在最好情况下的时间复杂度是 O ( l o g n ) O(log n) O(logn),但是当插入元素是有序的时候,二叉搜索树就变成了一个链表,在这种情况下,时间复杂度为 O ( n ) O(n) O(n)。
红黑树就是针对这一情形进行改进。红黑树本质上是一种二叉搜索树,但它在二叉搜索树的基础上额外添加了一个标记(颜色),同时具有一定的规则,这些规则使得红黑树保证一种平衡,插入、删除、查找的最坏时间复杂度都为 O ( l o g n ) O(logn) O(logn)。红黑树的统计性能要好于平衡二叉树。
红黑树的在原有的二叉搜索树上增加了如下几个要求:
1)每个结点要么是红色,要么是黑色
2)根节点永远是黑色的
3)所有叶子结点都是黑色的(红黑树中的叶子结点都是空结点(NIL)。)
4)每个红色结点的两个子结点一定都是黑色的(说明从根到结点的路径上不会有两个连续的红色结点,但黑色结点可以是连续的)
5)从任一结点到其子树中每个叶子结点的路径都包含相同数量的黑色结点。(是成为红黑树最主要的条件,后序的插入、删除操作都是为了遵守这个规定)
红黑树并不是标准的平衡二叉树,它是以上述要求作为一种平衡方法,使一棵n个结点的红黑树始终保持了 l o g n logn logn的高度,使得自己的性能得到提升。
2.红黑树的旋转
当对红黑树进行插入和删除等操作时,对树做了修改可能会破坏红黑树的性质。为了继续保持红黑树的性质,可以通过对结点进行重新着色,以及对树进行相关的旋转操作,即通过修改树中某些结点的颜色及指针结构,来达到对红黑树进行插入或删除结点等操作后继续保持它的性质或平衡的目的。
1)左旋操作:当在某个结点pivot上,做左旋操作时,我们假设它的右孩子不是NIL(叶子结点),pivot可以为任何不是NIL的左子节点。左旋操作是以pivot到其右孩子之间的链为“支轴”进行,使得其右孩子成为该子树的新根,而右孩子的左孩子成为pivot的右孩子。
左旋伪代码如下: