红黑树-元素添加

红黑树的五条性质:
1.节点是red或者black
2.根节点是black
3.叶子节点(空结点)都是black
4.red节点的子节点都是black
由4得出的推导性质
red节点的子节点都是black
从根节点到叶子节点的所有路径上不能有两个连续的red节点
5.从任一节点到叶子节点的所有路径都包含相同的black节点。

红黑树与四阶B树可以进行等价交换,因此我们学习的过程中使用类推的方法进行学习,如果你不理解B树的结构,建议先去理解看下B树的结构,不然学红黑树将会有一定的困扰。

添加
建议新添加的节点默认为red,这样能够让红黑树尽快满足(性质1,2,3,5都满足,性质4不一定。)
如果添加的是根节点,直接染成block即可。

添加的情况总共有**12``**种。这四种情况满足红黑树的性质,parent为black,不用做任何的处理
上图四种情况满足红黑树的性质4:parent为black
同样也满足4阶B树,因此不用做任何的处理。

下图8种不满足,需进行修复
在这里插入图片描述
后四种修复方式

LL/RR…型
判定条件:uncle(叔父节点)不是red
1、parent染成black,Groud(祖父)染成red。
2、grand(进行单旋操作)
LL:右旋转
RR:左旋转

LR\RL型
判定条件:uncle(叔父结点)不是red
1、自己染成black,grand染成red
2、进行双旋操作
LR:parent左旋转,grand右旋转
RL:parent右旋转,grand左旋转

前面四种修复方式(上溢情况)
RR、RL、LL、RR
判定条件:uncle(叔父结点)为red
1、parent、uncle染成black
2、grand向上合并。
对grand染成red,当做是新添加的结点进行处理。

伪代码实现(JAVA)
//添加的是根结点
if(parent == null)
{
black(node);
return;
}
处理前四种

//如果父节点是黑色,直接返回
if(isblack (parent))return;

//叔父结点
node uncle;
//祖父结点
node grand;

处理后八种
if(isred(uncle)){ //如果叔父是红色
black(parent);
black(uncle);
//把祖父结点当做是新添加的结点,默认是红色
add(red(grand));
return;
}

//如果叔父不是红色结点
if(parent.isleftchild () ){ //L
if(node.isleftchild() ){ //LL
black(parent);
red(grand);
rotateleft(grand);
}else{ //LR
black(node);
red(grand)
rotateleft(parent);
rotateright(grand);
}
}else{ //R
if(node.isleftchild()){ //RL
black(node)
red(grand)
rotateright(parent);
rotateleft(grand);
}else{ //RR
black(parent);
red(grand);
rotateleft(grand);
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值