對於紅黑樹的一點認識,
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函式實現節點刪除同時處理顏色規則。