算法学习 - 红黑树

168 阅读4分钟

0.初步了解红黑树

红黑树(rb-tree)是一种自平衡二叉查找树,典型的用途是实现关联数组。在1972年由鲁道夫·贝尔发明。红黑树虽然复杂,但是它的操作有着良好的最坏情况运行时间,而且在实践中运行高效:可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目。

1.用途和好处

红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如实时应用中有价值,而且使它们拥有在提供最坏情况担保的其他数据结构中作为建造板块的价值;例如,在计算几何中使用的很多数据结构都可以基于红黑树。

红黑树在函数式编程中也特别有用,在这里它们是最常用的持久数据结构之一,它们用来构造关联数组和集合,每次插入、删除之后它们都能保持为之前的版本。除了O(logn)的时间之外,红黑树的持久版本对每次插入或删除都需要O(logn)的空间。

红黑树是2-3-4树的一种等同。换句话说,对于每个2-3-4树,都存在至少一个数据元素是同样次序的红黑树。在2-3-4树上的插入和删除操作也等同于在红黑树中颜色翻转和旋转。这使得2-3-4树成为理解红黑树背后逻辑的重要工具,但是2-3-4树在实践中并不经常使用。

红黑树相对于AVL树来说,牺牲了部分平衡性来换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树。

【扩展】2-3-4树

zh.wikipedia.org/wiki/2-3-4%…

2.性质

红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

【二叉查找树性质】

1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

2.若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

3.任意节点的左右子树也分别为二叉查找树;

4.没有键值相等的节点。

【额外的性质】

1.节点是红色或黑色;

2.根是黑色;

3.所有叶子都是黑色(叶子是NIL节点);

4.每个红色节点必须有两个黑色的子节点(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

Image.png

这些约束确保了红黑树的关键特性:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。

要知道为什么这些性质确保了这个结果,注意到性质4导致了路径不能有两个毗连的红色节点就足够了。最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。因为根据性质5所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。

在很多树数据结构的表示中,一个节点有可能只有一个子节点,而叶子节点包含数据。用这种范例表示红黑树是可能的,但是会改变一些性质使得算法变得复杂。因为这里使用NIL叶子。它不包含数据而只充当树在此结束的指示。这些节点在绘图中经常被省略,但我们要知道其实这些节点时存在的。与此相关的结论是所有节点都有两个子节点,尽管其中的一个或两个可能是空叶子。

3.操作

因为每一个红黑树也是特化的二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。然而,在红黑树上进行插入操作和删除操作会导致不再匹配红黑树的性质。恢复红黑树的性质需要(Ologn)的颜色变更(实际上是非常快速的)和不超过三次树旋转(对于插入操作是两次)。虽然插入和删除很复杂,但操作时间仍可以保持为O(logn)次。

具体细节见wiki

zh.wikipedia.org/wiki/%E7%BA…