红黑树 - 2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28788687/article/details/79588444
  • 为什么这里还有一颗红黑树
    如果读者仔细的看了我所有的博客,你可能会发现在之前已经存在一篇关于红黑树的博文。那么你可能会诧异这里为什么还有一颗红黑树,难道是为了凑篇数?当然不是这样。前面的红黑树其实是”简化版“的红黑树,而这里我们我即将提到的无非是具有正统血缘的红黑树。事实上,前面的2-3-4查找树,也无非是为这里打下基础。
  • 红黑树的另一种定义
    [ 1 ] 每个节点或为红色或为黑色。
    [ 2 ] 根节点是黑色的。
    [ 3 ] 如果一个节点是红色的,其子节点必然是黑色的。
    [ 4 ] 整颗树是黑平衡的。
    如果我们将这里的定义与前面那篇《红黑树》那里定义进行比较,我们会看见后面这种定义仿佛是在放大限制,而以前的限制无非是在现在定义上再加上一种限制。具体体现在,简易版的红黑树不予许存在红色的红链接,也就是红色的右节点,而全面版的红黑树允许存在红色右节点。

  • 插入
    我们依旧为新节点染成红色,因为如果染成黑色我们一定会违反规则中的第四条。我们将新节点染成红色,当插入位置的父节点已经是红节点时,我们可以通过重新染色,旋转来改变它。
    我们先讨论一些这里与之前的不同处。
    首先如果将红色节点收上去,这里将允许4-节点的出现,而前面的简易版本只允许存在3-节点。这里的许多策略与前面基本相同,而这里存在许多镜像的情况。
    1.在 2- 节点 插入新节点
    当新节点插入2-节点时,我们直接插入,生成3-节点,而不用考虑简易版红黑树在新节点充当其父节点的右节点时,我们要进行一次左旋转。
    2 .向一个3-节点插入新节点
    注意在简易版中只可能存在红链接充当其父节点左链接的情况,而在标配版中还存在红链接充当其父节点右链接的情况,下面进行分情况讨论

    • 当红节点在其父节点左边时
      【 1 】 . 新键大于树中两个键
      这里我们直接生成4-节点,而不是进行简易版本的重新染色。
      【 2 】 .新键小于树中两个键
      采用相同的旋转方法,重新染色,但染色方法不同,我们直接将旋转后的左右节点染成红色,父节点染成黑色。而不是染成左红右黑,父节点染成黑色。
      【 3 】 .新键在树中两个键之间
      旋转方法相同,同样经历两次旋转,但染色时同样将左右节点染成红色,父节点染成黑色。而不是染成左红右黑,父节点染成黑色。()
    • 当红节点在其父节点左边时
      【 1 】 新键大于树中两个键
      与上文新键小于树中两个键情况,成镜面对称。
      【 2 】 .新键小于树中两个键
      与新键大于树中两个键情况,成镜面对称。
      【 3 】 .新键在树中两个键之间
      与前面新键在树中两个键之间,成镜面对称。
      3.向底部3-节点插入新节点
      与简易版策略类似,我们通过上面的策略,注意这里所说的相同策略,主要是旋转操作,而不是染色操作,事实上这里与单个3-节点染色问题不同原因在于,单个3-节点将父节点染成黑色不会影响树的平衡性,而这里如果将我们底部的3-节点中间节点染成黑色,我们将影响树的平衡性(局部树高增加1)。因此我们选择将3-节点中间节点染成红色,然后将红节点向上传达。
      4.向4-节点中插入新键
      我们采用在2-3-4查找树中的策略,但要注意染色时要保证局部树的平衡性。(不再赘述)

    • 红黑树的一些性质
      【 1 】一颗红黑树有不少于 2 h - 1 个内部黑色节点
      【 2 】一颗红黑树有不超过 4 h - 1 个内部节点
      【 3 】 任意黑色节点的普通高度至多是其黑色高度的 2 倍
      【 4 】假设T为一个n个·内部节点的红黑树,则红黑树的普通高度不超过 2 l o g ( n + 1 ) ,基于红黑树的查找代价为O( l o g n ).

猜你喜欢

转载自blog.csdn.net/qq_28788687/article/details/79588444