我如何在时间 O(log(n)) 的给定节点处拆分 AVL 树?

How can i split an AVL tree at a given node at time O(log(n))?

我一直在绞尽脑汁尝试各种方法,但我得到的最好方法是 O(log^2(n))。 确切的问题是: 创建一个函数 Split(AVLtree T, int k) 其中 returns 2 AVL 树(如元组)使得 T1 中的所有值都小于或等于 k,其余值在 T2 中。 k 不一定在树中。时间必须是 O(log(n))。 假设 AVL 树的有效实现,我设法用时间 O(log(|h1-h2|)).

创建了一个合并函数

如有任何帮助,我们将不胜感激。

你已经快完成了,因为你有合并功能!

在树中定期搜索 k 的后继者。这将追踪出一条从根到该后继节点的树路径。想象一下,以这种方式切割路径上的每条边,这将为您提供 "pennants," 个单个节点的集合,合法的 AVL 树悬挂在两侧。然后,证明如果您以正确的顺序将它们重新合并在一起,合并的成本会形成一个伸缩总和,总计为 O(log n)。