数据结构-红黑树插入结点示例

  • 1、红黑树简介
  • 2、在线可视化生成红黑树工具
  • 3、红黑树插入结点性质和规则
    • 3.1、红黑树插入结点性质
    • 3.2、红黑树插入结点规则
  • 4、红黑树插入结点示例
    • 4.1、红黑树插入结点示例(带有过程描述)
      • 4.1.1、带有过程描述-补充-两种不旋转的方法
    • 4.2、红黑树插入结点示例(不带过程截图)

1、红黑树简介

  红黑树(Red Black Tree)是一种特定类型的二叉树,它是在计算机科学中用来组织数据比如数字的块的一种结构。
  红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被Leo J.Guibas和Robert Sedgewick修改为如今的“红黑树”。
  红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1<所以红黑树不是严格意义上的平衡二叉树(AVL),但对之进行平衡的代价较低,其平均统计性能要强于 AVL 。
  ------粘百度百科

2、在线可视化生成红黑树工具

  网址是:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

3、红黑树插入结点性质和规则

3.1、红黑树插入结点性质

  一颗红黑树是满足如下红黑性质的二叉排序树:
  1、每个结点或是红色,或是黑色的;
  2、根结点是黑色的
  3、叶结点(虚构的外部结点、NULL结点)都是黑色的
  4、不存在两个相邻的红结点(即红结点的父结点和孩子结点均是黑色的)
  5、对每个结点,从该结点到任一叶结点的简单路径上,所含黑结点的数量相同。

3.2、红黑树插入结点规则

  红黑树插入结点的规则总结如下图3-1所示(验证总结的,若有哪里不对,请指出):

图3-1

4、红黑树插入结点示例

4.1、红黑树插入结点示例(带有过程描述)

  下面展示具体例子,关键字序列为:89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674。【不看过程的话,直接跳转到:4.2、红黑树删除示例(不带过程截图)即可】。

  1、新插入红黑树的结点初始着为红色,插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第1个,构建过程截图和在线可视化工具结果截图如图4-1和图4-2所示。

  图中步骤①,新插入结点"89"初始时为红色,根据红黑树插入结点性质2【红黑树根结点是黑色】,所以"89"更新为黑色。

图4-1 过程截图

图4-2 在线可视化工具结果截图

  
  2、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第2个,构建过程截图和在线可视化工具结果截图如图4-3和图4-4所示。

  图中步骤①,新插入结点"79"初始时为红色,根据红黑树插入结点规则③【当前待插入结点"79"的父结点"89"是黑色,直接插入当前结点"79"】

图4-3 过程截图

图4-4 在线可视化工具结果截图

  
  3、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第3个,构建过程截图和在线可视化工具结果截图如图4-5和图4-6所示。

  方法一:
  图中步骤①,新插入结点"82"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点性质3【虚构的外部结点都是黑色的】,即"82"结点的叔叔结点为黑色;故根据红黑树插入结点规则②【旋转】,由于79>82,所以先左旋。
  图中步骤②,82<89,所以右旋,根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,82和89是后旋转的,所以结点82和结点89颜色取反。
  方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-5 过程截图

图4-6 在线可视化工具结果截图

  
  4、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第4个,构建过程截图和在线可视化工具结果截图如图4-7和图4-8所示。

  图中步骤①,新插入结点"50"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点89、79、82均取反颜色。
  图中步骤②,根据红黑树插入结点规则①【爷爷结点检查更新】,再根据红黑树插入结点性质2【红黑树根结点是黑色】,所以"82"更新为黑色。

图4-7 过程截图

图4-8 在线可视化工具结果截图

  
  5、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第5个,构建过程截图和在线可视化工具结果截图如图4-9和图4-10所示。

  方法一:
  图中步骤①,新插入结点"13"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点性质3【虚构的外部结点都是黑色的】,即"13"结点的叔叔结点为黑色;故根据红黑树插入结点规则②【旋转】,由于50<79,故右旋。
  图中步骤②,根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,50和79是旋转的,所以结点50和结点79颜色取反。
  方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-9 过程截图

图4-10 在线可视化工具结果截图

  
  6、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第6个,构建过程截图和在线可视化工具结果截图如图4-11和图4-12所示。

  图中步骤①,新插入结点"3"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点79、13、50均取反颜色。
  根据红黑树插入结点规则①【爷爷结点检查更新】,但是取反色后的红黑树不需要任何调整,故不变。

图4-11 过程截图

图4-12 在线可视化工具结果截图

  
  7、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第7个,构建过程截图和在线可视化工具结果截图如图4-13和图4-14所示。

  图中步骤①,新插入结点"17"初始时为红色,根据红黑树插入结点规则③【当前待插入结点"17"的父结点"13"是黑色,直接插入当前结点"17"】

图4-13 过程截图

图4-14 在线可视化工具结果截图

  
  8、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第8个,构建过程截图和在线可视化工具结果截图如图4-15和图4-16所示。

  方法一:
  图中步骤①,新插入结点"18"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点3、17、13均取反颜色。
  图中步骤②,根据红黑树插入结点规则①【爷爷结点检查更新(查看爷爷结点的叔叔结点颜色后循环更新)】,爷爷结点"13"和结点"50"均为红色,而爷爷结点"13"的叔叔结点"89"为黑色,故根据红黑树插入结点规则②【旋转】,由于50<82,故右旋。
  图中步骤③,根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,50和82是旋转的,所以结点50和结点82颜色取反。
  步骤②+③的简化方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-15 过程截图

图4-16 在线可视化工具结果截图

  
  9、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第9个,构建过程截图和在线可视化工具结果截图如图4-17和图4-18所示。

  图中步骤①,新插入结点"14"初始时为红色,根据红黑树插入结点规则③【当前待插入结点"14"的父结点"17"是黑色,直接插入当前结点"14"】

图4-17 过程截图

图4-18 在线可视化工具结果截图

  
  10、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第10个,构建过程截图和在线可视化工具结果截图如图4-19和图4-20所示。

  图中步骤①,新插入结点"15"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点18、14、17均取反颜色。
  图中步骤②,根据红黑树插入结点规则①【爷爷结点检查更新(查看爷爷结点的叔叔结点颜色后循环更新)】,爷爷结点"17"和结点"13"均为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】,而爷爷结点"17"的叔叔结点"82"为红色,故根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点82、13、50均取反颜色。
  图中步骤③,根据红黑树插入结点规则①【爷爷结点检查更新】,再根据红黑树插入结点性质2【红黑树根结点是黑色】,所以"50"更新为黑色。

图4-19 过程截图

图4-20 在线可视化工具结果截图

  
  11、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第11个,构建过程截图和在线可视化工具结果截图如图4-21和图4-22所示。

  图中步骤①,新插入结点"25"初始时为红色,根据红黑树插入结点规则③【当前待插入结点"25"的父结点"18"是黑色,直接插入当前结点"25"】

图4-21 过程截图

图4-22 在线可视化工具结果截图

  
  12、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第12个,构建过程截图和在线可视化工具结果截图如图4-23和图4-24所示。

  方法一:
  图中步骤①,新插入结点"20"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点性质3【虚构的外部结点都是黑色的】,即"20"结点的叔叔结点为黑色;故根据红黑树插入结点规则②【旋转】,由于25>20,故右旋。
  图中步骤②,18<20,所以左旋,再根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,18和20是后旋转的,所以结点18和结点20颜色取反。
  方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-23 过程截图

图4-24 在线可视化工具结果截图

  
  13、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第13个,构建过程截图和在线可视化工具结果截图如图4-25和图4-26所示。

  方法一:
  图中步骤①,新插入结点"36"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点18、25、20均取反颜色。
  图中步骤②,根据红黑树插入结点规则①【爷爷结点检查更新(查看爷爷结点的叔叔结点颜色后循环更新)】,爷爷结点"20"和结点"17"均为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】,而爷爷结点"20"的叔叔结点"3"为黑色,故根据红黑树插入结点规则②【旋转】,由于13>17,故左旋。
  图中步骤③,根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,13和17是旋转的,所以结点13和结点17颜色取反。

  步骤②+③的简化方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-25 过程截图

图4-26 在线可视化工具结果截图

  
  14、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第14个,构建过程截图和在线可视化工具结果截图如图4-27和图4-28所示。

  图中步骤①,新插入结点"95"初始时为红色,根据红黑树插入结点规则③【当前待插入结点"95"的父结点"89"是黑色,直接插入当前结点"95"】

图4-27 过程截图

图4-28 在线可视化工具结果截图

  
  15、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第15个,构建过程截图和在线可视化工具结果截图如图4-29和图4-30所示。

  方法一:
  图中步骤①,新插入结点"90"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点性质3【虚构的外部结点都是黑色的】,即"90"结点的叔叔结点为黑色;故根据红黑树插入结点规则②【旋转】,由于90<95,故右旋。
  图中步骤②,89>90,所以左旋,再根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,89和90是后旋转的,所以结点89和结点90颜色取反。

  步骤①+②的简化方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-29 过程截图

图4-30 在线可视化工具结果截图

  
  16、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第16个,构建过程截图和在线可视化工具结果截图如图4-31和图4-32所示。

  图中步骤①,新插入结点"265"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点89、95、90均取反颜色。
  根据红黑树插入结点规则①【爷爷结点检查更新】,但是取反色后的红黑树不需要任何调整,故不变。

图4-31 过程截图

图4-32 在线可视化工具结果截图

  
  17、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第17个,构建过程截图和在线可视化工具结果截图如图4-33和图4-34所示。

  方法一:
  图中步骤①,新插入结点"262"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点性质3【虚构的外部结点都是黑色的】,即"262"结点的叔叔结点为黑色;故根据红黑树插入结点规则②【旋转】,由于262<265,故右旋。
  图中步骤②,262>95,所以左旋,再根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,262和95是后旋转的,所以结点262和结点95颜色取反。

  步骤①+②的简化方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-33 过程截图

图4-34 在线可视化工具结果截图

  
  18、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第18个,构建过程截图和在线可视化工具结果截图如图4-35和图4-36所示。

  方法一:
  图中步骤①,新插入结点"289"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点95、265、262均取反颜色。
  图中步骤②,根据红黑树插入结点规则①【爷爷结点检查更新(查看爷爷结点的叔叔结点颜色后循环更新)】,爷爷结点"262"和结点"90"均为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】,而爷爷结点"262"的叔叔结点"79"为黑色,故根据红黑树插入结点规则②【旋转】,由于90>82,故左旋。
  图中步骤③,根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,90和82是旋转的,所以结点90和结点82颜色取反。
  步骤②+③的简化方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-35 过程截图

图4-36 在线可视化工具结果截图

  
  19、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第19个,构建过程截图和在线可视化工具结果截图如图4-37和图4-38所示。

  方法一:
  图中步骤①,新插入结点"526"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点性质3【虚构的外部结点都是黑色的】,即"526"结点的叔叔结点为黑色;故根据红黑树插入结点规则②【旋转】,由于289>265,故左旋。
  图中步骤②,根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,265和289是旋转的,所以结点265和结点289颜色取反。
  方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-37 过程截图

图4-38 在线可视化工具结果截图

  
  20、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第20个,构建过程截图和在线可视化工具结果截图如图4-39和图4-40所示。

  方法一:
  图中步骤①,新插入结点"352"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点265、526、289均取反颜色。
  图中步骤②,根据红黑树插入结点规则①【爷爷结点检查更新(查看爷爷结点的叔叔结点颜色后循环更新)】,爷爷结点"289"和结点"262"均为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】,而爷爷结点"289"的叔叔结点"82"均为红色,故根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点82、262、90均取反颜色。
  根据红黑树插入结点规则①【爷爷结点检查更新】,但是更新取反色后的红黑树不需要任何调整,故不变。

图4-39 过程截图

图4-40 在线可视化工具结果截图

  
  21、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第21个,构建过程截图和在线可视化工具结果截图如图4-41和图4-42所示。

  方法一:
  图中步骤①,新插入结点"365"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点性质3【虚构的外部结点都是黑色的】,即"365"结点的叔叔结点为黑色;故根据红黑树插入结点规则②【旋转】,由于365>352,故左旋。
  图中步骤②,365<526,所以右旋,再根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,365和526是后旋转的,所以结点365和结点526颜色取反。
  方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-41 过程截图

图4-42 在线可视化工具结果截图

  
  22、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第22个,构建过程截图和在线可视化工具结果截图如图4-43和图4-44所示。

  方法一:
  图中步骤①,新插入结点"360"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点526、352、365均取反颜色。
  图中步骤②,根据红黑树插入结点规则①【爷爷结点检查更新(查看爷爷结点的叔叔结点颜色后循环更新)】,爷爷结点"365"和结点"289"均为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】,而爷爷结点"365"的叔叔结点"95"为黑色,故根据红黑树插入结点规则②【旋转】,由于262>289,故左旋。
  图中步骤③,根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,262和289是旋转的,所以结点262和结点289颜色取反。
  步骤②+③的简化方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-43 过程截图

图4-44 在线可视化工具结果截图

  
  23、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第23个,构建过程截图和在线可视化工具结果截图如图4-45和图4-46所示。

  图中步骤①,新插入结点"377"初始时为红色,根据红黑树插入结点规则③【当前待插入结点"377"的父结点"526"是黑色,直接插入当前结点"377"】

图4-45 过程截图

图4-46 在线可视化工具结果截图

  
  24、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第24个,构建过程截图和在线可视化工具结果截图如图4-47和图4-48所示。

  方法一:
  图中步骤①,新插入结点"522"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点性质3【虚构的外部结点都是黑色的】,即"522"结点的叔叔结点为黑色;故根据红黑树插入结点规则②【旋转】,由于522>377,故左旋。
  图中步骤②,522<526,所以右旋,再根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,522和526是后旋转的,所以结点365和结点526颜色取反。
  方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-47 过程截图

图4-48 在线可视化工具结果截图

  
  25、插入关键字序列(89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,674)中第25个,构建过程截图和在线可视化工具结果截图如图4-49和图4-50所示。

  方法一:
  图中步骤①,新插入结点"674"初始时为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】;再根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点377、526、522均取反颜色。
  图中步骤②,根据红黑树插入结点规则①【爷爷结点检查更新(查看爷爷结点的叔叔结点颜色后循环更新)】,爷爷结点"522"和结点"365"均为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】,而爷爷结点"522"的叔叔结点"262"均为红色,故根据红黑树插入结点规则①【叔叔结点+父亲结点+爷爷结点各取反色】,所以结点262、365、289均取反颜色。
  图中步骤③,根据红黑树插入结点规则①【爷爷结点检查更新(查看爷爷结点的叔叔结点颜色后循环更新)】,爷爷结点"289"和结点"90"均为红色,根据红黑树插入结点性质4【不存在两个相邻的红结点】,而爷爷结点"289"的叔叔结点"17"为黑色,故根据红黑树插入结点规则②【旋转】,由于90>50,故左旋。
  图中步骤④,再根据红黑树插入结点规则②【变色(后旋转的结点各取反色)】,50和90是后旋转的,所以结点50和结点90颜色取反。
  步骤③+④的简化方法二和方法三直接跳转到:"4.1.1、带有过程描述-补充-两种不旋转的方法"即可】。

图4-49 过程截图

图4-50 在线可视化工具结果截图

  

4.1.1、带有过程描述-补充-两种不旋转的方法

  其实红黑树插入结点规则③中旋转+变色,可以简化。
方法一:
  遇到两个红色结点相连时的情况就只有四种,如下图4-51中的①、②、③、④所示;而最终转换所得就一种情况,如下图4-51中的⑤所示:

图4-51   

  其中遇到①是肯定要先左旋变成②的,②之后右旋变成⑤;遇到③是肯定要先右旋变为④的,④之后左旋变成⑤。
  从图中不难看出,三个结点中选取中间值作为双亲结点,另外两个结点各自作为左右结点。
  对于LR或LL型,取反色的是标号为B、C的结点(也就是三个数值中较大的两个数);对于RL或RR型,取反色的是标号为A、C的结点(也就是三个数值中较小的两个数)。

  对于LR或LL型,举例:
  ①、比如"4.2、红黑树删除示例(带有过程描述)"中的第3步(下图4-52所示),79<82<89,那么取反色的就是82和89(三个数值中较大的两个数)。

图4-52 第3步截图   

  ②、比如"4.2、红黑树删除示例(带有过程描述)"中的第8步(下图4-53所示),13<50<82,那么取反色的就是50和82(三个数值中较大的两个数)。不再逐个举例,都是这样操作。

图4-53 第8步截图   

  对于RL或RR型,举例:
  ①、比如"4.2、红黑树删除示例(带有过程描述)"中的第12步(下图4-54所示),18<20<25,那么取反色的就是18和20(三个数值中较小的两个数)。

图4-54 第12步截图

  
  ②、比如"4.2、红黑树删除示例(带有过程描述)"中的第13步(下图4-55所示),13<17<20,那么取反色的就是13和17(三个数值中较小的两个数)。不再逐个举例,都是这样操作。

图4-55 第13步截图

  
方法二:
  直接把三个结点(过程中所有图中虚线框)按照顺序排左结点、双亲结点、右结点,即最小的是左结点,中间值当作当前三个结点的双亲结点,最大的是右结点;之后三个结点中哪个结点发生变化了,那个结点的颜色就取反(注:以下变化之前说的双亲结点是最上层结点,下面两层的结点在左边就称为左结点,在右边就称为右结点,这个说法只是我自己这样称的,觉得不能接受这样称呼的可以不往下看了,看到这里就当作结束啦【不看过程的话,直接跳转到:4.2、红黑树删除示例(不带过程截图)即可】)。

  举例:
  ①、比如"4.2、红黑树删除示例(带有过程描述)"中的第3步(下图4-56所示),当前插入结点82后,79<82<89,即79是82左结点,89是82右结点,82作为中间值当作当前三个结点的双亲结点。其中,79原本就是左结点,之后无变化还是左结点,颜色不变;82原本是右结点,之后变化为双亲结点,颜色取反;89原本是双亲结点,之后变为右结点,颜色取反。

图4-56 第3步截图   

  ②、比如"4.2、红黑树删除示例(带有过程描述)“中的第8步(下图4-57所示),当前操作是插入结点"18”,更新后爷爷结点"13"变为红色,而爷爷结点"13"的叔叔结点"89"为黑色,13<50<82,即13是50左结点,82是50右结点,50作为中间值当作当前三个结点的双亲结点。其中,13原本就是左结点,之后无变化还是左结点,颜色不变;50原本是左结点,之后变化为双亲结点,颜色取反;82原本是双亲结点,之后变为右结点,颜色取反。

图4-57 第8步截图   

  ③、比如"4.2、红黑树删除示例(带有过程描述)"中的第12步(下图4-58所示),当前插入结点20后,18<20<25,即18是20左结点,25是20右结点,20作为中间值当作当前三个结点的双亲结点。其中,18原本是双亲结点,之后变化为左结点,颜色取反;20原本是右结点,之后变化为双亲结点,颜色取反;25原本是右结点,之后无变化还是右结点,颜色不变。

图4-58 第12步截图

  
  ④、比如"4.2、红黑树删除示例(带有过程描述)“中的第13步(下图4-59所示),当前操作是插入结点"36”,更新后爷爷结点"20"变为红色,而爷爷结点"20"的叔叔结点"3"为黑色,13<17<20,即13是17左结点,20是17右结点,17作为中间值当作当前三个结点的双亲结点。其中,13原本是双亲结点,之后变化为左结点,颜色取反;17原本是右结点,之后变化为双亲结点,颜色取反;20原本是右结点,之后无变化还是右结点,颜色不变。不再逐个举例,都是这样操作。

图4-59 第13步截图

  
  以上就是红黑树的插入结点操作过程。

4.2、红黑树插入结点示例(不带过程截图)

  下面展示具体例子,关键字序列为:89,79,82,50,13,3,17,18,14,15,25,20,36,95,90,265,262,289,526,352,365,360,377,522,67。下面所有图中每一行分别是插入一个新结点的更新过程,【看具体过程的话,直接跳转到:4.1、红黑树删除示例(带有过程描述)即可】。

第1步截图

第2步截图

第3步截图

第4步截图

第5步截图

第6步截图

第7步截图

第8步截图

第9步截图

第10步截图

第11步截图

第12步截图

第13步截图

第14步截图

第15步截图

第16步截图

第17步截图

第18步截图

第19步截图

第20步截图

第21步截图

第22步截图

第23步截图

第24步截图

第25步截图

  
  以上就是红黑树的插入结点操作过程。

数据结构-红黑树插入结点示例相关推荐

  1. 红黑树----红黑树插入和删除结点的全程演示

    引言: 目前国内图书市场上,抑或网上讲解红黑树的资料层次不齐,混乱不清,没有一个完整而统一的阐述.而本人的红黑树系列四篇文章(详见文末的参考文献),虽然从头至尾,讲的有根有据,层次清晰,然距离读者真正 ...

  2. 红黑树的原理_红黑树插入算法实现原理分析

    ­ 引言 红黑树是在实际工程中被广泛应用的一种数据结构,比如Linux中的线程调度就是使用的红黑树来管理进程控制块,而Nginx中也是使用红黑树来管理的timer,Java中的TreeMap和Tree ...

  3. 数据结构 红黑树(RBTree)的原理与实现

    学习红黑树之前你应该保证你学过AVL树,也就是平衡二叉搜索树 数据结构 AVL树 AVL树是一棵高度平衡的二叉搜索树,其要求每个结点的高度差不能大于1,这样子就保证了其查询的时间复杂度为log2(N) ...

  4. 高级数据结构——红黑树

    目录 红黑树 红黑树定义 红黑树节点实现 红黑树插入实现 红黑树删除实现 红黑树 红黑树定义 在之前介绍AVL树时,我们知道AVL树是高度平衡的二叉搜索树,而高度平衡意味着在对AVL树中的节点作更新操 ...

  5. C语言 红黑树插入/删除/查找/遍历

    1 红黑树介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树. 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子 ...

  6. 红黑树插入时的自平衡

    红黑树插入时的自平衡 红黑树实质上是一棵自平衡的二叉查找树,引入带颜色的节点也是为了方便在进行插入或删除操作时,如果破坏了二叉查找树的平衡性能通过一系列变换保持平衡. 红黑树的性质 每个节点要么是红色 ...

  7. 数据结构---红黑树的原理

    产生原因 有了AVL树为啥需要红黑树呢,我们知道AVL树可以保证查询的时间复杂度为O(long 2^N),但是我们知道AVL树的插入操作,结点之间调整非常复杂,导致AVL树的性能非常低下. 红黑树,是 ...

  8. 数据结构——红黑树简谈

    一.基本概念 R-B Tree,全称是Red-Black Tree,又称为"红黑树",它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(B ...

  9. 底层实现红黑树_stl map底层之红黑树插入步骤详解与代码实现 | 学步园

    本篇文章并没有详细的讲解红黑树各方面的知识,只是以图形的方式对红黑树插入节点需要进行调整的过程进行的解释. 最近在看stl源码剖析,看到map底层红黑树的实现.为了加深对于红黑树的理解就自己动手写了红 ...

最新文章

  1. 链表问题4——反转单向链表
  2. php中time()和mktime()方法的区别
  3. 两个div叠加触发事件发生闪烁问题
  4. 数据结构之稀疏数组 - SparseArray
  5. 基于Boost::beast模块的快速WebSocket服务器
  6. RHadoop和CDH整合实例(三)- RHive
  7. git 安装及常用命令
  8. windows下工具
  9. securable的LOCKED ON,LOCKED OFF,YES,NO四个的区别
  10. 数据仓库详细介绍(九.数据质量)流程与工具
  11. 程序设计c语言作业章春芳,C语言说课PPT
  12. 树莓派编译安装完整版本ROS
  13. CVPR 2021 | 目标引导的人类注意力估计提升零样本学习
  14. Frequent Pattern Mining(频繁模式挖掘) - Aprior挖掘算法
  15. Vue3大菠萝pinia笔记
  16. apk对齐优化,作为移动开发程序员应该怎样去规划自己的学习路线?系列篇
  17. anaconda一次性更新所有安装库
  18. PHP爬虫最全总结-phpQuery,PHPcrawer,snoopy框架中文介绍
  19. URULE库文件的使用
  20. android字体ratingbar,Android 自定义View之自定义评分选择器RatingBar

热门文章

  1. 2016年第七届C/C++ B组蓝桥杯省赛真题
  2. winform手绘Step步骤进度节点线条图
  3. 论信息系统项目的沟通管理论文范文
  4. CCF A期刊和会议列表
  5. 综述 | 事件抽取及推理 (下)
  6. Outlook邮箱已经发出的邮件怎么撤回或重发替换
  7. 超级仓库管理系统---(1)概述
  8. matlab车牌识别的外文文献翻译,基于MATLAB的车牌识别系统研究(课设参考文献)
  9. 大宗风控体系“药不能停”:一线实战高手解密衍生品交易风险管控的三个层级!...
  10. 郭台铭:我的孩子若想钱多事少离家近 隔天就打断他腿