码迷,mamicode.com
首页 > 其他好文 > 详细

红黑树删除节点

时间:2016-09-14 21:53:24      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

参考《算法导论第三版》

红黑树删除方法比较。

传统方法:

  RB-Delete(T, z)

    if ((T.Nil == z.left) || (T.Nil == z.right))

      y = z

    else

      y = RB-Min(z.right)

    if (T.Nil != y.left)

      x = y.left

    else 

      x = y.right

    RB-Transplate(y, x)

    x.p = y.p

    if (z != y)

      copy y.data to z.data

    if (BLACK == y.color)

      RB-Delete-fixup(x)

    return;

    这种方法在删除有两个子节点的节点Z时,采用复制卫星数据的方式删除Z,其他方式与有序二叉树删除的方式一样。

改版方法:

  RB-Delete(T, z)

    y = z

    y.origincolor = y.color

    if (T.Nil == z.left)

      x = z.right

      RB-Transplate(y, x)

    elseif (T.Nil == z.right)

      x = z.left

      RB-Transplate(y, x)

    else

      y = RB-Min(x.right)

      y.origincolor = y.color

      x = y.right

      if (y == z.right)

        x.p = y

      else

        RB-Transplate(y, y.right)

        y.right = z.right

        y.right.p = y

      RB-Transplate(z, y)

      y.left = z.left

      y.left.p = y

      y.color = z.color

    if (BLACK == y.origincolor)

      RB-Delete-fixup(x)

    return;

    这种方法在删除有两个子节点的节点Z时,找到后继y, 不copy卫星数据而是修改指针,思想如下:如果y正好是Z的right,则只需要修改y的left就好;如果y不是,则先移除y,设置y的right,y的left;

  如果卫星数据copy开销很大,则改版方法的优势就体现出来。

 

红黑树删除节点

标签:

原文地址:http://www.cnblogs.com/BoostQt/p/5873523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!