对于红黑树的一点认识,

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函数实现节点删除同时处理颜色规则。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值