红黑树插入的实现

红黑树:

1.概念:

红黑树的性质:

红黑树的插入操作:

其前面的插入和二叉搜索树的一模一样,只是后面需要判断是否满足红黑树的性质:

具体分为三种情况:

1.uncle节点存在且为红色的:

对应如图:

这种情况只需要将parent和uncle节点都弄成黑色,对应的grandparent节点弄成黑色

接下来又会分为三种情况:

  • 1.如果对应的grandparent就是根节点,那么只需要将根节点再弄成黑色即可

  • 2.如果对应的grandparent的父亲是黑色节点,则直接结束即可

  • 3.如果对应的grandparent的父亲是红色节点,则需要将cur = grandparent,再次进行循环

2.uncle节点存在且为黑:

第一种情况:

对应的这种情况,对应的需要旋转+变色:

可以看出左边的长度长,所以进行右旋:

这里的右旋与AVL数的完全相同:

右旋之后就得到下图:

再将parent变为黑,grandparent变为红

是满足红黑树条件的。

第二种情况:

对应这种情况需要先想左旋在向右旋:

同样与AVL树完全相同:

左旋是以p为节点,右旋的时候以g为节点

再将cur变为黑,grandparent变为红

对应的结果如下:

还有另外两种情况对应的是 parent == grandparent -> right

这又会分为两种情况,

分别进行左旋或者右左双旋,再将parent/cur变为黑,grandparent变为红即可。

3.uncle不存在:

对应的情况如下:

第一种情况:

只需要进行一次右旋再将parent变为黑,grandparent变为红即可:

第二种情况:

需要进行左右双旋,再将再将cur变为黑,grandparent变为红:

还有另外两种情况对应的是 parent == grandparent -> right

这又会分为两种情况,

分别进行左旋或者右左双旋,再将parent/cur变为黑,grandparent变为红即可。

通过分析之后,发现uncle节点存在且为黑和uncle节点不存在可以和为一种情况:

所以,一共有两大种情况:

1.uncle存在且为红:进行变色+循环即可

2.uncle存在且为黑/uncle不存在:进行旋转+变色即可

这里的代码其实不是关键。关键是思想

对应的代码如下:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值