1、红黑树
红黑树是AVL树的一种变种,对红黑树的操作在最坏的情况下花费的时间是O(logN),红黑树主要有以下几个性质:
(1)每一个节点或者是红色,或者是黑色。
(2)根是黑色的。
(3)所有NULL结点称为叶子节点,且认为是黑色的。
(4)如果一个节点是红色的,那么它的子节点必须是黑色的。
(5)从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。
2、自底向上插入操作
由于性质的约束,插入点不能为黑节点,应插入红节点。因为你插入黑节点将破坏性质5,所以每次插入的点都是红结点,但是若他的父节点也为红,就破坏了性质4。这个时候需要做一些旋转和一些节点的变色。另为叙述方便我们给要插入的节点标为N(红色),父节点为P,祖父节点为G,叔节点为U,下边将一一列出所有插入时遇到的情况。
情况1:
该树为空树,直接插入根结点的位置,违反性质2,把节点颜色红色改为黑色即可。
情况2:
插入节点N的父节点P为黑色,不违反任何性质,无需做任何修改。
情况3:
N为红,P为红(祖节点一定存在,且为黑,下边同理),U也为红,这里不论P是G的左孩子,还是右孩子;不论N是P的左孩子,还是右孩子。
图1 N、P、U为红 G为黑
操作:如图把P、U改为黑色,G改为红色,未结束。N、P都为红,违反性质4;若把P改为黑,符合性质4,显然左边多了一个黑节点,违反性质5;所以我们把G,U都改为相反色,这样一来通过G的路径的黑节点数目没变,即符合4、5,但是G变红了,若G的父节点又是红的不就有违反了4,的确是这样,所以经过上边操作后未结束,需把G作为起始点,即把G看做一个插入的红节点继续向上检索。属于哪种情况,按那种情况操作。要么中间就结束,要么知道根结点(此时根结点变红,根结点向上检索,那就没有了,只好把P变为黑色)。
情况4:
N为红,P为红,U为黑,P为G的左孩子,N为P的左孩子(或者P为G的右孩子,N为P的右孩子)。
图2 左左情况
操作:如图P、G变色,P、G变换即左左单旋(或者右右单旋),结束。要知道经过P、G变换(旋转),变换后P的位置就是当年G的位置,所以红P变为黑,而黑G变为红都是为了不违反性质5,而维持到达叶节点所包含的黑节点的数目不变。右右情况和左左情况类似,如下所示。
图3 右右情况
情况5:
N为红,P为红,U为黑,P为G的左孩子,N为P的右孩子(或者P为G的右孩子,N为P的左孩子;反正两方向相反)。
图4 左右情况
操作:需要进行两次变换(旋转),首先P、N变换,颜色不变;然后就变成了情形4的情况,按照情况4操作,即结束。由于P、N都为红,经变换,不违反性质5;然后就变成4的情形,此时G与G现在的左孩子变色,并变换,结束。右左情况类似,如下所示。
图5 右左情况
未完,待续……