您将如何实现具有延迟删除的平衡树?

时间:2009-03-11 23:25:29

标签: avl-tree

更具体地说,AVL树。可能吗?我想这样做,但我认为未经删除的节点可能会因轮换来管理。

我有一个正常工作,但我想使用这个删除其他东西。

2 个答案:

答案 0 :(得分:1)

如果您希望它与所有节点(包括标记为已删除的节点)保持“平衡”,则您无需执行任何操作 - 您已经在那里。

如果你希望它相对于未删除的节点保持“平衡” - 问题是为什么?平衡的全部意义是防止逃跑(线性最坏情况)搜索这取决于节点,而不是它们的删除状态。

答案 1 :(得分:1)

在AVL树的上下文中,究竟什么不删除意味着

这可能意味着您在删除时 no 工作,也就是说,根本不更新树。

这将导致树无法正确重新平衡,因为平衡因子的向上扫描将使用不正确的平衡因子。

这可能意味着更新平衡因素而不是平衡。

这意味着当你决定删除某些东西时,你会最终得到平衡因子大于2或小于-2;这意味着需要多次旋转来纠正。这里的问题是,在轮换时你不能再知道你是否已经消除了一个子树深度;因为虽然你知道在一侧有3个子树深度太多,你不再知道它正是导致每个级别的额外深度的一个元素 - 你通常知道这是因为你一次添加或删除单个元素 - 所以你不知道你需要做多少次旋转。您可能会进行三次旋转并且只丢失一个子树深度,因为在该深度处有两个元素。事实上,你怎么能够知道要旋转哪些元素来获取必要的元素?它们不一定都存在于您选择的删除元素的路径中以及平衡因子为3的点。

我不确定,但我会说出懒惰的删除会打破我们所知道的AVL。

无论如何,你为什么要拖延? AVL的重点是在每次添加/删除时分摊重新平衡成本,以便保持在O(log n) - 为什么要建立重新平衡债务以实现更大,更低频率的再平衡?