最近三天都在看红黑树,进度实在太慢。看的时候感觉书中采用的修正算法都太过抽象,也有可能是自己这方面的思维有所欠缺吧。作者的方法非常的巧妙,是很具备数学方法的。通过对情况进行抽象,原本红黑树要求的5个条件,由于元素的插入和删除是迭代进行的,把需要修正的条件减少到两个。即插入时需要保证新插入的元素z和z.parent不同是为红,当处理这种情况时,通过对临近元素颜色的改变和树的旋转来满足条件,或者将冲突的z和z.parent上移来迭代解决。
在处理删除元素的时候,对删除的元素z有双子树时,可以用z的successor y来代替,这样一来,当z的单子树的情况也就和处理删除y,且y最多有单子树的情况统一起来。所需要解决的就是有单子树,或者没有子树的情况了。同时由于红黑树的性质,只有单子树时,旁枝元素就可以用枚举法列出所有情况然后解决了。但是红黑树算法提出了一个非常好的想法,它没用用到y具有单子树的特殊性,却给出了一个更为普适的方法。当删除了元素y时,如果y时红树则没有影响,如果y时黑树,这样就破坏了包含y的子枝的黑高。倘若把y的黑高并入到y的子树x中,x可以为T.nil。这样x记为两个黑枝,黑高为2;或红黑枝,黑高为1。我们通过对删去y后的临枝的旋转和变色,即可解决x的双重黑高的问题,可以将x的黑转移到别的节点的红枝上;或者将x的一个黑计数上移,通过迭代解决。当如果上移迭代遇到的时红节点,就搞好完成,因为没有改变子枝的黑高,而且没有其他违反条件的地方,如果遇到黑节点,则继续变换解决或迭代,直到root节点。在root节点就不用考虑双重黑节点了,即减去1个黑计数,所有的枝叶黑高都减1,对结构没影响。
本文只是作为我的学习记录,写的太没头绪,不值得看。我学习算法用的是机械工业的算法导论,如果大家想了解红黑树可以查看。