红黑树

红黑树必须符合以下特性:

  1. 所有节点都是红色或者是黑色
  2. 根节点总是黑色,root节点是黑色
  3. 如果节点是红色,子节点必须是黑色(不能出现两个连续的红色节点)
  4. 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度,高度只差不超过4,一条路径全黑,一条路径一半黑一半红)

5.新插入的节点都是红色的

 

数据调整:1.变色  2.左旋  3.右旋

 

插入调整----------------------------------------------------

插入分为两大情况,A新插入节点的父节点是左孩子B新插入节点的父节点是右孩子

A和B有分别有三种情况,所有,一共有六种情况,AB是相反的,属于对称,知道A情况,B的操作和A相反,即可

 

新插入节点Z,

A1,z的父节点和叔叔节点都是红色(隐含条件:z的爷爷节点是黑色),

将z的父辈节点全部变为黑色,z的爷爷节点变为红色,此时,z节点树符合红黑树特性。将z的爷爷节点设置为新插入节点标识

 

A2,z是右孩子且z的叔父节点是黑色(z的父节点为红色),对z的父节点树进行左旋操作,将z的原父节点标识为新插入节点

A3,z为左孩子且z的叔父节点是黑色(z的父节点为红色),将z的爷爷节点设置为红色,对z的爷爷节点进行右旋操作

 

B的情况在操作的时候,旋转方向和A相反即可

 

删除-----------------------------------------------------

节点的删除,先删除,后调整

删除,和二叉树的删及其相似,删除阶段,并不会维护红黑树的特性,只是删除

1.删除节点的左孩子是空节点,使要删除节点的右孩子子树替换

2.删除的节点右孩子是空节点,使要删除节点的左孩子子树替换

3.删除的节点既有有孩子又有左孩子,循环得到右孩子子树的最左边的节点为顶位节点

    3.1如果得到的这个顶位节点,就是要删除节点的右孩子,直接替换(这种情况就是说要删除节点的右孩子没有子节点)

3.2顶位节点不是要删除节点的右孩子,使顶位节点的顶位节点的右孩子互换,在把顶位节点替换要删除的节点

 

上面是删除的步骤,删除之后,就要调整为红黑树了,在删除过程中记录了两次颜色,

第一次,最开始,记录要删除节点的颜色。第二是是在删除步骤3开始的时候记录了顶位节点的颜色。(两次记录颜色使用的是同一个变量,第二次记录,第一次就没有了)

 

 

删除的节点,颜色是极为重要的,

如果删除的是红色节点,那么舒服,不用做任何改动,因为红色节点不会影响黑色高度

如果删除的黑色节点,就要分情况讨论了。

 

调整红黑树------------------------------------------

所有调用调整红黑树方法的条件就是记录颜色的变量==balck。

 

 

调整时分为四种情况,这四种情况是一个while循环体内,判断条件是传入的节点不是根节点并且颜色是黑色:

传入节点x ,

1.传入节点是左孩子,并且x有兄弟节点(这个兄弟节点是右节点)w,右节点颜色为红色

操作:把右节点设置为黑色,x的父节点设置为红色将x.p节点进行左旋

 

2.传入节点是左孩子,并且x有兄弟节点(这个兄弟节点是右节点)w,w的左孩子是黑色,并且w的右孩子也是黑色,

操作:把w设置为红色即可把x.p节点设置为x

 

3.传入节点是左孩子,并且x有兄弟节点(这个兄弟节点是右节点)w,w的右孩子是黑色

操作:w的左孩子设置为黑色,w设置为红色,以w为节点进行右旋

 

 

4.传入节点是左孩子,并且x有兄弟节点(这个兄弟节点是右节点)w,w的右孩子是红色

操作:将x的父节点的颜色给w节点,x.p设置为黑色,w右孩子设置黑色,以x的父节点进行左旋,并将x设置为根节点,之后跳出循环

 

最后将根节点设置为黑色

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值