1.左旋
1) 创建红黑树节点指针ptrbnRight并指向当前节点的右儿子(以右节点称呼);
2) if (将右节点的左儿子设置为当前节点的右儿子且不为空节点) {
3) 右节点的左儿子的父亲节点指向当前节点;
4) }
5) 将当前节点设置为右节点的左儿子;
6) if (将当前节点的父亲节点设置为右节点的父亲节点且不为空节点){
7) if(当前节点为其父亲节点的左儿子){
8) 右节点设置为当前节点的父亲节点的左儿子;
9) }else{
10) 右节点成为当前节点的父亲节点的右儿子;
11) }
12) }else{
13) 右节点设置为根节点;
14) }
15) 右节点设置为当前节点的父亲节点。
2.右旋
1) 创建红黑树节点指针ptrbnLeft并指向指定节点的左儿子(以左节点称呼);
2) if (将左节点的右儿子设置为当前节点的左儿子且不为空节点) {
3) 当前节点设置为左节点的右儿子的父亲节点;
4) }
5) 将当前节点设置为左节点的右儿子;
6) if (将当前节点的父亲节点设置为左节点的父亲节点且不为空节点){
7) if(当前节点为其父亲节点的右儿子){
8) 左节点成为当前节点的父亲节点的右儿子;
9) }else{
10) 左节点成为当前节点的父亲节点的左儿子;
11) }
12) }else{
13) 左节点设置为根节点;
14) }
15) 左节点设置为当前节点的父亲节点。
3.插入节点并处理颜色规则
1) 创建父节点ptrbnParent和祖父节点ptrbnGparent;
2) while(创建的父节点ptrbnParent是当前节点的父亲节点且不为空同时ptrbnParent为红色节点){
3) 祖父节点ptrbnGparent设置为父节点ptrbnParent的父亲节点;
4) if(父节点ptrbnParent是祖父节点ptrbnGparent的左儿子){
5) 创建叔叔节点ptrbnUncle为祖父节点ptrbnGparent的右儿子;
6) if(叔叔节点ptrbnUncle存在且为红色节点){
7) 叔叔节点ptrbnUncle设置为黑色节点;
8) 父节点ptrbnParent设置为黑色节点;
9) 祖父节点 ptrbnGparent设置为红色节点;
10) 将祖父节点设置为当前节点;
11) 继续执行;
12) }
13) if(当前节点是父节点ptrbnParent的右儿子){
14) 创建中间节点ptrbTmp;
15) 以父节点ptrbnParent作为支点左旋;
16) 将父节点设置为中间节点;
17) 当前节点成为父节点;
18) 中间节点成为当前节点;
19) }
20) 将父节点ptrbnParent设置为黑色节点;
21) 祖父节点ptrbnGparent设置为红色节点;
22) 以祖父节点ptrbnGparent为支点进行右旋;
23) }else{
24) 创建叔叔节点ptrbnUncle为祖父节点的左儿子;
25) if(叔叔节点ptrbnUncle存在且为红色节点){
26) 叔叔节点ptrbnUncle设置为黑色节点;
27) 父节点ptrbnParent设置为黑色节点;
28) 祖父节点 ptrbnGparent设置为红色节点;
29) 将祖父节点设置为当前节点;
30) 继续执行;
31) }
32) if(当前节点为父节点ptrbnParent的左儿子){
33) 创建中间节点ptrbTmp;
34) 以父节点ptrbnParent作为支点右旋;
35) 将父节点设置为中间节点;
36) 当前节点成为父节点;
37) 中间节点成为当前节点;
38) }
39) 将父节点ptrbnParent设置为黑色节点;
40) 祖父节点ptrbnGparent设置为红色节点;
41) 以祖父节点ptrbnGparent为支点进行左旋;
42) }
43) }
44) 根节点的颜色设置为黑色。
4.删除节点并处理颜色规则(分为几种情况)
1) 创建新的节点指针ptrbnOther(以兄弟节点称呼在后面);
2) while(!ptrbn||ptrbn->TRBN_iColor==LW_TREE_RB_BLACK)&&ptrbn!=ptrbn->TRBN_ptrbnNode){
3) if(当前节点是父节点的左儿子){
4) 兄弟节点设置为父节点的右儿子;
5) if(兄弟节点的颜色为红色){
6) 将兄弟节点颜色设置为黑色;
7) 父节点的颜色设置为红色;
8) 将父节点作为支点进行左旋;
9) 更新兄弟节点,指向左旋后父节点的右儿子;
10) }
11) if((!ptrbnOther->TRBN_ptrbnLeft|| ptrbnOther->TRBN_ptrbnLeft->TRBN_iColor ==LW_TREE_RB_BLACK) &&(!ptrbnOther->TRBN_ptrbnRight||ptrbnOther->TRBN_ptrbnRight->TRBN_iColor==LW_TREE_RB_BLACK)){
12) 将兄弟节点颜色设置为红色;
13) 将父节点设置为当前节点;
14) 设置当前节点的父亲节点为最新父节点;
15) }else{
16) if(!ptrbnOther->TRBN_ptrbnRight||ptrbnOther->TRBN_ptrbnRight->TRBN_iColor==LW_TREE_RB_BLACK){
17) 创建新节点兄弟节点的子节点ptrbnOtherLeft;
18) if(兄弟节点的子节点ptrbnOtherLeft是兄弟节点的左儿子且不为空节点){
19) 兄弟节点的子节点颜色设置为黑色;
20) }
21) 兄弟节点的颜色设置为红色;
22) 将兄弟节点作为支点进行右旋;
23) 兄弟节点设置为父节点的右儿子;
24) }
25) 将兄弟节点的颜色设置成与父节点相同的颜色;
26) 父节点的颜色设置为黑色;
27) if(兄弟节点的右儿子存在){
28) 兄弟节点的右儿子颜色设置为黑色;
29) }
30) 将父节点作为支点进行左旋;
31) 当前节点更新成为根节点;
32) break退出;
33) }else{
34) 兄弟节点设置为父节点的左儿子;
35) if(兄弟节点的颜色为红色){
36) 将兄弟节点颜色设置为黑色;
37) 父节点的颜色设置为红色;
38) 将父节点作为支点进行右旋;
39) 更新兄弟节点,指向右旋后父节点的左儿子
40) }
41) if((!ptrbnOther->TRBN_ptrbnLeft||ptrbnOther->TRBN_ptrbnLeft->TRBN_iColor==LW_TREE_RB_BLACK)&&(!ptrbnOther->TRBN_ptrbnRight||ptrbnOther->TRBN_ptrbnRight->TRBN_iColor==LW_TREE_RB_BLACK)){
42) 将兄弟节点颜色设置为红色;
43) 将父节点设置为当前节点;
44) 设置当前节点的父亲节点为最新父节点;
45) }else{
46) if(!ptrbnOther->TRBN_ptrbnLeft||ptrbnOther->TRBN_ptrbnLeft->TRBN_iColor==LW_TREE_RB_BLACK){
47) 创建新节点兄弟节点的子节点ptrbnOtherRight;
48) if(兄弟节点的子节点ptrbnOtherRight是兄弟节点的右儿子且不为空节点){
49) 兄弟节点的子节点颜色设置为黑色;
50) }
51) 兄弟节点的颜色设置为红色;
52) 将兄弟节点作为支点进行左旋;
53) 兄弟节点设置为父节点的左儿子;
54) }
55) 将兄弟节点的颜色设置成与父节点相同的颜色;
56) 父节点的颜色设置为黑色;
57) if(兄弟节点的左儿子存在){
58) 兄弟节点的左儿子颜色设置为黑色;
59) }
60) 将父节点作为支点进行右旋;
61) 当前节点更新成为根节点;
62) break退出;
63) }
64) }
5.删除指定节点
树节点指针ptrbnChild和ptrbnParent(分别以子节点和父节点称呼);
2) 定义变量iColor来描述节点颜色;
3) if(当前节点的左儿子不存在){
4) 将当前节点的右儿子设置为子节点;
5) }else if(当前节点的右儿子不存在){
6) 将当前节点的左儿子设置为子节点;
7) }else{
8) 创建节点指针ptrbnOld备份节点和ptrbnLeft左节点其中ptrbnOld指向当前节点;
9) 更新当前节点,将原当前节点的右儿子设置为新的当前的节点;
10) while(将当前节点的左儿子设置为左节点且不为空节点){
11) 左节点设置为当前节点;
12) }
13) 当前节点的右儿子节点设置为子节点;
14) 当前节点的父亲节点设置为父节点;
15) 当前节点的颜色赋值给iColor变量;
16) if(子节点存在){
17) 父节点设置为子节点的父亲节点;
18) }
19) if(父节点存在){
20) if(当前节点是父节点的左儿子节点){
21) 子节点设置为父节点的左儿子;
22) }else{
23) 子节点设置为父节点的右儿子;
24) }
25) }else{
26) 子节点设置为根节点;
27) }
28) if(备份节点是当前节点的父亲节点){
29) 当前节点设置成为父节点;
30) }
31) 将备份节点的父亲节点设置为当前节点的父亲节点;
32) 备份节点的颜色设置为当前节点的颜色;
33) 备份节点的右儿子节点设置为当前节点的右儿子节点;
34) 备份节点的左儿子节点设置为当前节点的左儿子节点;
35) if(备份节点的父亲节点存在){
36) if(备份节点是其父亲节点的左儿子){
37) 当前节点设置为备份节点的父亲节点的左儿子;
38) }else{
39) 当前节点设置为备份节点的父亲节点的右儿子;
40) }
41) }else{
42) 将当前节点设置为根节点;
43) }
44) 当前节点设置为备份节点的左儿子的父亲节点;
45) if(备份节点的右儿子节点存在){
46) 当前节点设置为备份节点的右儿子的父亲节点;
47) }
48) 跳转到颜色处理代码块__color
49) }
50) 当前节点的父亲节点设置为父节点;
51) 将当前节点的颜色赋值给变量iColor;
52) if(子节点存在){
53) 父节点设置为子节点的父亲节点;
54) }
55) if(父节点存在){
56) if(当前节点是父节点的左儿子){
57) 子节点设置为父节点的左儿子;
58) }else{
59) 子节点设置为父节点的右儿子;
60) }
61) }else{
62) 子节点设置为根节点;
63) }
64) __color代码块:
65) if(iColor是黑色){
66) 调用__tree_rb_erase_color函数实现节点删除同时处理颜色规则。