红黑树定义和性质
红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:
性质1:每个节点要么是黑色,要么是红色。
性质2:根节点是黑色。
性质3:不能有连在一起的红色节点
性质4:每个红色的两个子节点都是黑色,叶子节点都是黑色:出度为0满足了性质就可以静思的平衡了

插入规则
所有插入节点默认为红色
为满足红黑树性质,红黑树有三种变换:
所有插入的点默认都是红色,否则全黑色就是普通二叉树了,下一步也就无法按照规律变换以达到自平衡。
变色规则
变色
当前结点是红色,父结点是红色,且它的叔叔结点也是红色(自红,父红,叔叔红)
把父结点设为黑色
把叔叔结点设为黑色
把祖父结点设为红色
把指针结点定义到祖父结点设为当前要操作的,分析的点变换的规则(此时可能是要左右旋)
左旋
当前结点是右子树,且是红色
父结点是红色
叔叔结点是黑色(右红,父红,叔叔黑)
以父结点左旋
右旋
当前节结点是左子树,红色,父结点红色,叔叔黑色。(左红,父红,叔叔黑)
把父结点变为黑色
把祖父变为红色
以祖父为结点右旋
插入步骤
待插入节点6,分别从跟节点逐个比较

这里违背了不能有两个连在一起的红色节点 性质三
且当前节点的父亲节点为红色&&祖父节点的另一个子节点也为红色(叔叔节点),满足变换颜色
根据变换规则:将当前节点的父节点和祖父节点的另一个子节点(叔叔节点)同时变为黑色&&当前节点的祖父节点变为红色,最后把指针定义到祖父节点最为当前节点继续进行条件判断。
变换后得到:

根据红黑树的性质依旧不满足 性质三
继续根据变换规则判断:当前节点(12)的父节(5)点为红色,祖父节点的另一个子节点[叔叔节点(30)]为黑色,且当前节点为父节点的有字数,–> 需要进行左旋:将当前节点(12)提升为父节(5)点的父亲同时将当前节点(12)的左子树挂载到原父节点(5)的右子树上,原父节点(5)作为当前提升节点(12)的左子树,以父节点(5)为旋转节点。
以旋转点作为当前节点
如图

旋转后继续根据性质判断
违背不能有连在一起的红色节点 性质三
由上图可知:当前节点(5)与父节点(12)为红色,当前节点的祖父节点(19)的另一个节点[叔叔(30)]为黑色,且当前节点(5)为左子树,满足右旋:将当前节点的父节点(12)变为黑色,祖父节点(19)变为红色,并以祖父节(19)点为旋转节点。
如图所示

继续判断红黑树性质,此时满足
例二:

例三

变色转换总结:
情况一:爸爸和叔叔节点为红色首先边爸爸和叔叔的颜色,
情况二:如果爸爸是红色叔叔为黑色则分类讨论
观察爸爸在祖父的哪一边,如果在左侧则通过变化得到一个爸爸与当前节点的一个LL双红关系
如果在右侧则通过变化得到一个爸爸与当前节点的一个RR双红关系
如果出现LR或RL双红参考例一和例二进行变化,得到一个当前节点与爸爸的一个LL或RR的关系
约定:自己为I,父亲P,祖父PP,叔叔U
左旋
RL型左旋不需要变色。RR型左旋需要将P变黑PP变红再左旋。
右旋
LR型右旋不需要变色。LL型右旋需要将P变黑PP变红再右旋。
变色
RR左旋时变色,LL右旋变色,I,P,U三红:U,P,PP,分别变色
细节图不多主要文字描述,参考连接过程更详细。
本文只作为笔记,信息正确性有待推敲。
欢迎讨论。
参考:https://blog.csdn.net/zhaoyajie1011/article/details/107791743
1190

被折叠的 条评论
为什么被折叠?



