在top-language 讨论组中搜索红黑树,找到了一篇文章“说到红黑树” ,作者是pongba,根据文章提到的资料,发现对理解红黑树有很大帮助。
以下是转的内容:
就恰好看到chen yufei同学的博客上提到了。我得去看看Sedgewick老大是怎么说的。
via: http://chenyufei.name/blog/2008-07-07/left-leaning-red-black-tree/
CLRS 上对 Red Black Tree (RBT) 的介绍简直是一团乱麻,代码又乱,解释又罗嗦,我完全没有实现它的兴趣……
不得不佩服 Robert Sedgewick 啊,他在 Algorithms in C 里先介绍 2-3-4 Tree,把 RBT 作为 2-3-4
Tree 的一种表示方式来介绍 Red Black Tree,这样就清楚多了。当然,Sedgewick 本来就是 Red Black Tree
的发明者之一 <http://en.wikipedia.org/wiki/Red-black_tree>,他能够讲清楚也就不奇怪了。除了解释清楚以外,Sedgewick
使用递归实现,因此代码很简洁,看起来很舒服。
不过即使如此,Red Black Tree 还是很复杂,所以即使看了 Sedgewick 的代码以后还是没有自己实现的冲动。好在 Sedgewick
已经考虑过这个问题,其结果就是 Left-Leaning Red Black
Tree<http://www.cs.princeton.edu/%7Ers/talks/LLRB/RedBlack.pdf>。(这
份幻灯片做得非常好!Apple 的 Keynote 貌似不错啊。)LLRBT 跟 RBT 的不同之处在于 2-3-4 Tree 的 3 node 在
LLRBT 中只有一种表示方式,因此 LLRBT 减少了 RBT 的插入/删除需要处理的情况数量,从而大大减小了复杂度。RBT 的 Java
迭代实现要用 150 行代码,而递归实现需要 46 行代码,LLRBT 递归则只需要 33
行。删除需要的代码行数也大大减小了,实现难度当然也大大降低了。
我用 Common Lisp 试着实现了 LLRBT,确实很简单。不过我还在想怎样才能迭代实现 LLRBT,找到了 FreeBSD 用头文件实现的
LLRBT<http://www.freebsd.org/cgi/cvsweb.cgi/%7Echeckout%7E/src/lib/libc/std…>
,被彻底雷到了,这宏用的太牛了!
*prince <http://w-a-n.cn/>* on 7 July, 2008 at 7:35 pm #
wikipedia 上的RB-tree也是一坨的,看了都不想看。
最后还是死啃 CLRS 书看懂红黑树的。
不过让我现在描述红黑树,还是没有把握记得。