红黑树

转自http://www.cnblogs.com/zhangchaoyang

红黑树RB-tree

RB-tree是满足以下4个条件的二叉查找树:

  1. 每个节点不是红色就是黑色
  2. 根节点为黑色
  3. 不能存在两个连续的红色节点
  4. 任一节点至NULL(树尾端)的每一条路径上,所含黑节点的数目必须相同

红黑树并不要求左右子树高度差控制在1以内,它的平衡条件比AVL树弱。然而红黑树通常能够导致良好的平衡状态,经验告诉我们,红黑树的平均搜索效率和AV-tree几乎相等,但是其插入节点的开销相对较低,实践中发生旋转的次数相对较少。

以下所有操作,在新插入节点后,首先将新节点设为红色。

按照二叉查找树的规则插入新节点后,如果新增节点的父节点为黑,则直接插入。否则分为4种情况(在此作一些符号约定,新增节点为X,其父节点为P,祖父节点为G,伯父节点为S,曾祖父节点为GG):

  1. S为黑,且X为外侧插入。P,G做一次单旋转,并更改P,G的颜色。
  2. S为黑,且X为内侧插入。 X,P做一次单旋转,并更改X和P的颜色。再对X,G做一次单旋转。
  3. S为红,且X为外侧插入。 P,G做一次单旋转,并更改X的颜色。此时如果GG为黑,一切搞定;否则,还得继续往上做,直到不再有父子节点连续为红的情况。
  4. S为红,且X为内侧插入。直接更改P,S,G的颜色。此时如果GG为黑,一切搞定;否则,还得继续往上做,直到不再有父子节点连续为红的情况。

为了避免上述情况3、4中GG也为红的情况发生,我们设计一个“自顶向下”的红黑树。假设新增节点为A,那么就延着从根节点到A的路径,只要看到某个节点X的两个子节点皆为红色,就把这两个子节点改为黑色,同时把X改为红色。但是如果此时X的父节点也是红色(注意此时X的伯父节点已经不可能是红色),就像上述情况1那样作一次单旋转改变颜色,或像情况2那样做一些双旋转再改变颜色。

转载于:https://www.cnblogs.com/li-hao/archive/2013/04/16/3024744.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值