删除红黑树的整个子树会保留其属性吗?

Posted

技术标签:

【中文标题】删除红黑树的整个子树会保留其属性吗?【英文标题】:Deleting a whole subtree of a red-black tree would keep its properties? 【发布时间】:2011-08-05 15:09:49 【问题描述】:

我目前正在实现一个红黑树数据结构来为应用程序执行一些优化。

在我的应用程序中,在给定点,我需要从树中删除所有小于或等于给定值的元素(您可以假设这些元素是整数)。

我可以一个一个地删除元素,但我想要更快的东西。因此,我的问题是:如果我删除一棵红黑树的整个子树,我该如何修复这棵树以恢复高度和颜色不变量?

【问题讨论】:

【参考方案1】:

从红黑树中批量删除很困难,因为黑高不变量被搞砸了。假设您没有进行(软)实时操作,我会一个一个地删除(因为您必须一个一个地插入它们,我们在这里讨论的是一个较小的常数因子)或切换到一个展开树.

【讨论】:

【参考方案2】:

从红黑树中删除一个元素需要 O(log n) 时间,其中 n 是树中当前元素的数量。

如果你只删除了几个元素,那么最好只一个一个地删除它们,最终以 O(k log n) 操作结束(k = 删除的元素,n = 删除前树中的元素)。

但是如果你知道你要移除大量的节点(例如树的 50% 或更多),那么最好遍历你想要保留的元素 (O(k') 操作其中 k ' = 要保留的元素),然后报废树(O(1) 或 O(n),具体取决于您的内存管理方案)并重建树(O(k' log k'))操作。总复杂度为 O(k')+O(k' log k') = O(k' log k'),当 k'

好吧,无论如何,当您要删除大部分元素时,最好在实践中枚举您想要保留的元素,然后重建树。

【讨论】:

【参考方案3】:

编辑:下面是一个通用的子树删除。您需要的只是一个Split 操作(根据您的实际问题内容)。

在最坏的情况下O(log n)时间可以删除红黑树的整个子树。

已知SplitJoin对红黑树的操作可以在O(log n)时间内完成。

Split : 给定一个值 k 和一个红黑树 T,将 T 拆分为两棵红黑树 T1 和 T2,使得 T1 中的所有值 = k.

Join : 将两棵红黑树 T1 和 T2 合并成一棵红黑树 T。 T1 和 T2 满足 T1 中的 max

你需要的是两个Splits和一个Join

在您的情况下,您需要删除的子树将对应于一系列值L <= v <= U

因此,您首先在 L 上 Split,在 T1 Split U 上的 T2 以在 T3 Join T1 和 T4 树。

在 pseudoCode 中,您的代码将如下所示:

Tree DeleteSubTree( Tree tree, Tree subTree) 

    Key L = subTree.Min();
    Key U = subTree.Max();

    Pair <Tree> splitOnL = tree.Split(L);
    Pair <Tree> splitOnU = splitOnL.Right.Split(U);

    Tree newTree = splitOnL.Left.Join(splitOnU.Right);

    return newTree;

更多信息请参见:https://cstheory.stackexchange.com/questions/1045/subrange-of-a-red-and-black-tree

【讨论】:

以上是关于删除红黑树的整个子树会保留其属性吗?的主要内容,如果未能解决你的问题,请参考以下文章

红黑树插入删除详细步骤动画演示与AVL树的区别

寻找红黑树的操作手册

红黑树的特性与插入操作

红黑树:删除

红黑树介绍与实现

红黑树介绍与实现