想象一棵红黑的树。是否总会有一系列插入和删除操作来创建它?


41

让我们假设以下是红黑树的定义:

  1. 它是二叉搜索树。
  2. 每个节点都被涂成红色或黑色。根是黑色的。
  3. 通过边连接的两个节点不能同时为红色。
  4. 像Wiki一样,这应该是NIL叶的良好定义NIL叶为黑色。
  5. 从根到任何NIL叶的路径都包含相同数量的黑色节点。


假设您已经为红黑树实现了insertdelete操作。现在,如果为您提供了有效的红黑树,是否总有一个构造它的insert和序列delete


动机

这个问题是由这个问题和这个问题的讨论引起的

就个人而言,我确实相信,如果您想象一个仅由黑色节点组成的有效红黑树(这意味着您正在想象一个完美平衡的树),那么将有一个由insertdelete构成的序列。然而,

  1. 我不知道如何准确证明
  2. 我也对更一般的情况感兴趣

您的问题听起来有点循环...任何一组插入和删除操作都将构造一棵红黑树...实际上什么都可以,因为红黑只是一个定义。您的问题仅限于纯黑树吗?
JOX

2
不,我想你误会了。当然,任何插入和删除集都会构造一些红黑树。问题是这样的:是否可以通过某些插入和删除序列来构造符合定义的任何树?如果给您一些树,是否可以重新创建一系列插入和删除操作?
alisianoi

2
@ all3fox是的,您是对的。有一种算法使用该运算insertdelete构造仅由黑色节点组成有效红黑树。它使用插入/删除来创建高度为的树。首先,我们可以使用插入物以广度优先的方式创建一个完美平衡的红黑树,然后使用插入物并将相同数量的缺失重新绘制为一棵全黑的树。这里的技巧是将树的最低红色层向上移动倍,直到到达根。(h+2)2h1h2h+11h2h1h
安东·特鲁诺夫

1
@AntonTrunov谢谢,我有点理解。普通的红黑树情况如何?您认为,可以使用insertdelete运算构造给定的红黑树吗?
alisianoi 2015年

2
一)答案将取决于精确的实施insertdelete; 可能有几种方法可以执行这些操作。b)由于RB树本质上是4阶B树,因此可以从中寻找灵感。由于从RB到B(和/或向后)的映射不是唯一的,因此细节可能很棘手。
拉斐尔

Answers:


2

红黑树中的插入和删除操作包括维持红黑属性所需的平衡。

非(左或右)倾斜的红黑树的问题在于,在基本删除或插入后,有多种方法可以还原红黑度。
改变树的不是插入或删除,而是随后发生的重新平衡和旋转来保存/恢复树的红色黑色。

红黑树的基本描述没有规定采取哪种可能的路线。由于重新平衡不一定是确定性的,因此
可能无法弄清楚如何精确地重建给定的红黑树。

这已经被左倾斜的红黑树“解决”了。
平衡只有一种方法。因此,任何给定的倾斜红黑树都可以使用插入和删除来重建,因为重新平衡/旋转是通过特定的确定性方式完成的。

这并不意味着左倾的RB树更好或更有效,它们一方面通过使用确定性的平衡规则而获得收益,另一方面却通过更复杂的平衡代码而失去了收益。

按照@Anton的评论:
有一种算法使用插入和删除操作来构造仅由黑色节点组成的有效红黑树。它使用插入/删除来创建高度为的树。首先,我们可以使用插入以广度优先的方式创建一个完美平衡的红黑树,然后使用插入并将相同数量的缺失重绘为一棵全黑的树。这里的技巧是将树的最低红色层向上移动倍,直到到达根。(h+2)2h1h2h+11h2h1h

我认为像Day-Stout-Warren这样的完整平衡算法会更有效率。


1
使用这些操作insert以及delete从CLRS书中,您可以构建仅包含黑色节点的有效RB树。技巧是插入比所需更多的节点,然后删除过多的节点。该算法消除红色节点。
安东·特鲁诺夫

@AntonTrunov,您是否有该算法的链接,将其包含在答案中会很好。我无法使用我的google-fu找到它。
约翰,

1
不幸的是我没有链接。当时我试图回答这个问题,并针对所有黑色RB树的特殊情况提出了一种算法。我在该评论中对此进行了描述,但没有提供证据。
安东·特鲁诺夫

您的意思是“这已经被左倾的红黑树'解决了'。” 即使是左倾的红黑树也有多种存储相同项目的方式。
user239558 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.