情况4:关注节点 a 的兄弟节点 c 是黑色的,并且 c 的右子节点是红色的,我们就依次进行下面的操作:
- 围绕关注节点 a 的父节点 b 左旋。
- 将b的颜色复制给c,因为c替代了b的位置。
- 将关注节点 a 的父节点 b 的颜色设置为黑色。
- 从关注节点 a 中去掉一个黑色,节点 a 就变成了单纯的红色或黑色。
- 将关注节点 a 的叔叔节点 e 设置为黑色,调整结束。
- 此时a跟d深度是一样的,因为无法判别ad是否为红,直接将b设置为黑的了,此时e提高了一度为保持平衡也设置为黑色的了。
- 多画图,不画图单看代码一会儿就眩晕了。
- 插入跟删除算法都是用到了递推,比如插入情况1,情况1的处理之后,关注节点从本身变成了它的祖父红色节点,这就是往根节点递推。不过情况1处理过一次之后,不一定会进入情况2或者情况3,有可能还在情况1。在情况1的情况下一直往根节点走,因为当前节点永远是红色,所以在最后要把根节点涂黑。同时只要进入到情况2、情况3情况,操作就跟上面说过的类似了。
- 要记住,除了关注的节点所在的子树,其他的子树本身都是一颗红黑树,它们是满足红黑树的所有特征的。当关注节点往根节点递推时,这个时候关注节点的子树也已经满足了红黑树的定义,我们就不用再去特别关注子树的特征。只要注意关注节点往上的部分。这样就能把问题简化,思考的时候思路会清晰一些。
- 再说到删除算法,注意红-黑跟黑-黑存在的原因,为何最终都会走到从兄弟节点的地方做文章来实现最终的平衡。
- 删除情况1的目的只是为了能够进入接下来的三个情况中。
- 删除情况2的套路又是一个递推思路,关注节点往根节点递推,让其左右子树都满足红黑树的定义。因为往上推,右子树多了一个黑色节点,就把关注节点的兄弟节点变红。
- 删除情况3是为了进入删除情况4,提前变色的原因和情况2是一样的,都是为了满足黑色深度相同。同样是归纳推理的思路。都要记住一点,各种情况下的其他子树节点都满足红黑树的定义,需要分类讨论的,都在这几种情况中了。
- 可能你看今天看了红黑树的删除你顿悟了,过了半个月又迷糊了。不要怕!因为怕也没用,再看呗。学习红黑树本身也不是为了面试字节去默写,而是去学习思想,锻炼思维,复杂问题简单化,当然了顺带也可以装的一手好B。

推荐一个零声教育C/C 后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C 后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
原文:红黑树硬核讲解
,