1. 程式人生 > >對於紅黑樹的一點認識,

對於紅黑樹的一點認識,

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函式實現節點刪除同時處理顏色規則。