任何人都可以建议我指向迭代算法的指针插入和删除到红黑树吗? .Net / C#中可用的所有算法都基于递归,我无法信任处理大量数据(因此插入/删除的递归深度很大)。有人基于迭代有一个吗?
注意:Goletas.Collection对AVL树使用迭代算法,这对于大量数据非常有效,我也想要与Red-Black Tree类似的东西。
答案 0 :(得分:6)
基于树的算法本质上是递归的。
当然你可以重写它们以进行迭代,但这将是徒劳的。原因如下:
红黑树和类似的数据结构自我平衡,它们的高度与存储的值的数量成对数。这意味着你将从不达到递归上限 - 这将要求你插入~2 2000 元素,这根本不会发生:你的计算机没有足够的记忆,永远不会永远。
- 坚持递归,没关系。
答案 1 :(得分:2)
答案 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