数据结构——红黑树(RB-Tree)

本文介绍了红黑树的定义,包括其性质和结构图,并详细阐述了红黑树的左旋、右旋操作,以及插入和删除操作的处理方式,特别是针对插入后如何通过旋转和重新着色来维护红黑树的性质。
摘要由CSDN通过智能技术生成

定义:

    红黑树本质上是一棵二叉查找树,但在二叉查找树的基础上,每个节点增加了一位存储来表示节点的颜色。有关二叉查找树的介绍在前面博文《二叉查找树》已经介绍过了,这里不再进行讲解。

红黑树的性质:

  1. 每个节点或是红色的,或是黑色的。
  2. 根节点是黑色的。
  3. 每个叶节点(NULL)是黑色的。
  4. 如果一个节点是红色的,则它的两个孩子节点都是黑色的。
  5. 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

红黑树的结构图:


旋转

    当对红黑树进行插入和删除操作时,会违背红黑树的性质,为了维护这些性质,必须要改变树中某些节点的颜色以及指针结构。指针结构的修改时通过旋转来完成的,这是一种能保持二叉查找树性质的查找树局部操作。

左旋转:

    当在某个节点x上做左旋转操作时,假设它的右孩子为y而不是NULL,左旋转以x到y的链为“支轴”进行。它使y成为该子树的新的根节点,x成为y的左孩子,y的左孩子成为x的右孩子。

LEFT_ROTATE(T,x)
    y = right[x]   //获取右孩子
    rihgt[x] = left[y]  //设置x的右孩子为y的左孩子
    if left[y] != NIL
       then parent[left[y]] = x
    parent[y] = parent[x]  //设置y的父节点为x的父节点
    if parent[x] == NIL
       then root[T] = y
    else if x==left[parent[x]
            then left[parent[x]] = y
         else  right[[parent[x]] = y
    left[y] = x  //设置y的左孩子为x
    parent[x] =y


右旋转:

右旋转与左旋转的描述差不多,具体见下面结构图


RIGHT_ROTATE(T,y)
     x = left[y]    //获取左孩子
     left[y] = right[x] //设置y的左孩子为x的右孩子
     if right[x] != NIL
        then parent[right[x]] = y
     parent[x] = parent[y]  //设为x的父节点为y的父结点
     if parent[y] == NIL
         then root = x
     else if y== left[parent[y]]
             then left[parent[y]] = x
          else  right[parent[y]] = x
     right[x] = y //设置x的右孩子为y
     parent[y] = x

插入操作:

    红黑树的插入操作类似于二叉查找树的插入操作,只是在它的基础上进行改进,先把节点按照二叉查找树的插入方法进行插入,再把该插入的节点标记为红色(为了满足性质5),为了保证插入节点后能够维持红黑树的性质,我们必须调用一个辅助程序RB_INSERT_FIXUP来对结点重新着色并旋转,使得满足红黑树的性质。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值