我正在学习左倾红黑树
,教授是罗伯特·塞奇威克
http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf http://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf
虽然我已经理解了2-3树
和LLRB
的插入
,但我已经花费了两周共40小时,仍无法掌握LLRB
的删除
操作。
有没有人能真正向我解释一下LLRB
的删除
?
我正在学习左倾红黑树
,教授是罗伯特·塞奇威克
http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf http://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf
虽然我已经理解了2-3树
和LLRB
的插入
,但我已经花费了两周共40小时,仍无法掌握LLRB
的删除
操作。
有没有人能真正向我解释一下LLRB
的删除
?
好的,我会尝试这个,并且也许SO上的其他热心网友可以帮忙。你知道,一种认为红色节点是树中
这就是为什么所有新节点都是红色的原因。当节点(局部)平衡时,它们会进行颜色翻转,并将红色传递给父节点,现在父节点相对于其兄弟可能看起来不平衡。
作为一个例子,考虑从大到小添加节点的情况。您从节点Z开始,它是根节点并且为黑色。您添加一个名为Y的节点,它是红色的,并且是Z的左子节点。您添加了一个红X作为Z的子代,但是现在您有两个连续的红色节点,所以您向右旋转,重新着色,您拥有一个平衡的、全黑的(没有不平衡 /“新节点”!)以Y为根的树 [第一张图]。现在您按顺序添加W和V。起初它们都是红色的[第二张图],但立即V / X / W向右旋转并翻转颜色,以便只有X是红色的[第三张图]。这很重要:X为红色表示Y的左子树不平衡了2个节点,换句话说,左子树中有两个新节点。因此,红色链接的高度是新的、潜在不平衡节点数的计数:红色子树中有2^height个新节点。
fixUp()
过程将在返回树时解决这些节点。 fixUp()
大概维护着常规的LLRBT不变式:“没有连续的红色节点”和“没有右红色节点”。哈佛计算机科学教授对Sedgwich实现及其删除方法发表了有趣的评论。左倾红黑树被认为是有害的于2013年撰写(您引用的Sedgwich pdf日期为2008年):
我能找到的 Sedgwich 代码最新版本,其中包含一个 2-3 实现,日期为2014年4月。它在他的算法书网站上RedBlackBST.java。棘手的写作
Sedgewick的论文很棘手。截至2013年,插入部分将2-3-4树作为默认值,并将2-3树描述为一种变体。然而,删除实现仅适用于2-3树。如果您实现了插入的默认变体和唯一的删除变体,则您的树将无法工作。该文本未突出显示从2-3-4到2-3的转换:不友好。
按照下列策略删除不在叶节点中的LLRB树上的任意节点:
如果是叶节点中的值,则无需使用继承者替换该值,但我们仍然需要将当前树转换为2-3-4树以删除该值。
这个演示文稿的页面20
https://algs4.cs.princeton.edu/lectures/keynote/33BalancedSearchTrees.pdf和书籍《算法 第四版》中的页面437
是关键。它们展示了LLRB树如何转化为2-3树。在书籍《算法 第四版》的页面442
https://books.google.com/books?id=MTpsAQAAQBAJ&pg=PA442中,有一种树形变换算法。