参考:
算法导论中文版(第二版),以前没仔细看,仔细看后发觉内核红黑树的实现完全照着来得,理论明白,代码则简单并且有条理多了。
http://blog.csdn.net/v_JULY_v/article/details/6284050,博主其他相关红黑树文章也可参考。
有人会说具体情况知道怎么修改红黑属性,但是写不出代码,本人想了想,因为具体情况修改的时候不考虑问题一般性,所以难于写出代码。本人也想不出一般处理方法,不过伟大的前人已经帮我们解决这个问题,本文反其道而行之。理解算法实现之后,通过实例,指出具体的结点插入删除之后所处的初态,想象代码执行的步骤,加深对算法的理解。
红黑树插入红结点可能存在以下三种情况需要调整(对称情况在此没有列出):
1.z的叔叔y是红色的。
2.z的叔叔y是黑色的,且z是右孩子。
3.z的叔叔y是黑色的,且z是左孩子。
说明:以上三种情况,z的父节点必然是红结点,否则无须调整红黑属性。
红黑树删除结点之后可能存在以下四种情况需要调整(对称情况在此没有列出):
1.x的兄弟w是红色的。
2.x的兄弟w是黑色的,且w的两个孩子都是黑色的。
3.x的兄弟w是黑色的,w的右孩子是黑色的,左孩子是红色的。
4.x的兄弟w是黑色的,且w的右孩子是红色的。(此时,左孩子红黑属性无所谓)
具体详情参考 算法导论中文版(第二版)。
以下列出插入对应的具体入口情况:
简单说明:
1-3:对应书上具体case1到case3。(下同)
X:插入结点之后无需调整红黑属性。
反:则是由于左右对称产生的情况。(下同)
以下列出删除对应的具体入口情况:
简单说明:
S:直接把替代结点红孩子变为黑结点。比如删除结点1,找到2替代,把2的孩子3直接变为黑结点。
X:删除的是叶子红结点(可以是替代结点),无需调整红黑性质。
?:根结点,特殊处理,不同于以上任何情况。
以下为代码添加打印信息的打印结果: