红黑树的迭代算法

时间:2010-09-21 08:03:08

标签: .net algorithm red-black-tree

任何人都可以建议我指向迭代算法的指针插入和删除到红黑树吗? .Net / C#中可用的所有算法都基于递归,我无法信任处理大量数据(因此插入/删除的递归深度很大)。有人基于迭代有一个吗?

注意:Goletas.Collection对AVL树使用迭代算法,这对于大量数据非常有效,我也想要与Red-Black Tree类似的东西。

3 个答案:

答案 0 :(得分:6)

基于树的算法本质上是递归的。

当然你可以重写它们以进行迭代,但这将是徒劳的。原因如下:

红黑树和类似的数据结构自我平衡,它们的高度与存储的值的数量成对数。这意味着你将从不达到递归上限 - 这将要求你插入~2 2000 元素,这根本不会发生:你的计算机没有足够的记忆,永远不会永远。

- 坚持递归,没关系。

答案 1 :(得分:2)

感谢大家的宝贵意见。我只是在VB6和C中找到了一个。我认为它足以掌握这个想法。这是链接

  1. Article
  2. C Source
  3. VB Source
  4. 希望有人会觉得有帮助。 :)

答案 2 :(得分:1)

Thomas H Cormen,Charles E Leiserson,Ronald L Rivest,Clifford Stein的 Introduction to Algorithms 中有一个版本。

伪代码可在Google books在线获取(第270页)。

正如评论中指出的那样,将数据复制到节点z而不是在第14/15行中将z替换为y的方法并不是最佳的,特别是如果你有指向其他地方节点的指针。因此,第13-16行可以改为:

do_fixup = y.color == BLACK

if y is not z:
    replace_parent(tree, y, z)
    y.left = z.left
    y.left.parent = y
    y.right = z.right
    y.right.parent = y
    y.color = z.color

if do_fixup:
    ...

replace_parent定义为(也可用于第7-12行):

def replace_parent(tree, a, b):
    a.parent = b.parent
    if not b.parent:
        tree.root = a
    else:
        if b is b.parent.left:
            b.parent.left = a
        else:
            b.parent.right = a