在Clojure中的CLRS Second Edition中的红黑树删除修复

时间:2013-06-19 00:04:42

标签: clojure red-black-tree clrs interval-tree

我正在按照CLRS第2版,第4版,第288-9页对间隔树实施红黑树删除。

错误摘要:

RB-删除 - Fixup时

如果x和w是前哨节点,这可能是RB-Delete的结果,那么颜色的评估(左(w))和。 RB-Delete-Fixup中的颜色(右(w))在while循环的第一次迭代中遇到空指针异常。

(if (and (= (get-color (get-left @w)) black) 
         (= (get-color (get-right @w)) black)) ;; Bug here!

这个问题的所有代码都在Clojure中:

https://github.com/mobiusinversion/interval-trees

,这是抛出异常时的红黑树状态图:

http://gorillamatrix.com/files/rb-delete-fixup.jpg

失败的单元测试是

(deftest insert-seven-delete-three-test ... )
文件中的

test/interval_trees/interval_tree_test.clj 

以下是lein测试的输出结果:

$ lein test

lein test interval-trees.interval-test

lein test interval-trees.interval-tree-test

lein test :only interval-trees.interval-tree-test/insert-seven-delete-three-test

ERROR in (insert-seven-delete-three-test) (core.clj:2108)
Uncaught exception, not in assertion.
expected: nil
  actual: java.lang.NullPointerException: null
 at clojure.core$deref_future.invoke (core.clj:2108)
    clojure.core$deref.invoke (core.clj:2129)
    interval_trees.interval_tree$get_color.invoke (interval_tree.clj:61)
    interval_trees.interval_tree$delete_fixup.invoke (interval_tree.clj:451)
    interval_trees.interval_tree$delete$fn__323.invoke (interval_tree.clj:528)

问题似乎是在作业之后

w <- right(p(x))
CLRS

,pg。 289 rb-delete-fixup第7行伪码,w指向sentinel节点,因此没有左右检查伪码的第9行的颜色。

Clojure实现中抛出异常的行就在这里

src/interval_trees/interval_tree.clj:451 (where you see Bug here! comment)

勘误表中似乎没有提交错误:

http://www.cs.dartmouth.edu/~thc/clrs-bugs/bugs-2e.php

我很抱歉这个问题非常具体和密集,但非常感谢我的帮助,我已经在这里坚持了几天。

这个人似乎问了同样的问题但没有得到答案 Red Black Tree deletion algorithm

更新:我在第三版第三次打印中实现了删除和删除修复程序,但无法解决问题。

1 个答案:

答案 0 :(得分:1)

这是我的错误,我认为节点“颜色”是其卫星数据的一部分。事实并非如此。