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

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 过程截图

![在这里插入图片描述](https://img-blog.csdnimg.cn/a43248c01bdb483f905a69bc5bc04c4c.png

图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步截图

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

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值