一. 红黑树
红黑树是自平衡的二叉搜索树。搜索的时间复杂度是logN。插入,删除,旋转,染色的操作时间复杂度都是O(logN);每个节点只需要用一个bit来保存颜色(颜色仅为红黑两种)属性。
红黑树的每个节点有五个域(color,key,lchild,rchild,parent)。它会保存父节点的指针。
红黑树具有以下五个性质
①红黑树的节点必须是红色或者黑色。
②根节点必须是黑色
③叶节点是黑色的(这里的叶节点,不是传统意义上的树的页节点,而是说最下层的空节点,也就是传统意义上的叶节点的子节点。默认为黑色)
④红色节点必须有两个黑色节点的儿子
⑤从任一节点出发到其每个叶子节点的路径,黑色节点的数量是相等的。
手打太繁琐,关于红黑树下面的内容转自http://www.cnblogs.com/v-July-v/archive/2010/12/29/1983707.html
树的旋转知识
当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质。
为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树种某些结点的颜色及指针结构,以达到对红黑树进行
插入、删除结点等操作时,红黑树依然能保持它特有的性质(如上文所述的,五点性质)。
树的旋转,分为左旋和右旋,以下借助图来做形象的解释和介绍,这个旋转和平衡二叉树的旋转类似:
1.左旋
如上图所示:
当在某个结点pivot上,做左旋操作时,我们假设它的右孩子y不是NIL[T],pivot可以为树内任意右孩子而不是NIL[T]的结点。
左旋以pivot到y之间的链为“支轴”进行,它使y成为该孩子树新的根,而y的左孩子b则成为pivot的右孩子。
来看算法导论对此操作的算法实现(以x代替上述的pivot):
LEFT-ROTATE(T, x)
1 y ← right[x] ▹ Set y.
2 right[x] ← left[y] ▹ Turn y’s left subtree into x’s right subtree.
3 p[left[y]] ← x
4 p[y] ← p[x] ▹ Link x’s parent to y.
5 if p[x] = nil[T] <