繁体   English   中英

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

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

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

任何帮助将不胜感激。

鉴于您具有合并功能,您就快到了!

在树中对 k 进行常规后继搜索。 这将在树中找到从根到该后继节点的路径。 想象一下,以这种方式切割路径上的每一条边,这将为您提供一组“三角旗”,即具有合法 AVL 树的单个节点悬挂在两侧。 然后,证明如果你以正确的顺序将它们重新合并在一起,合并的成本会形成一个叠加的总和,加起来为 O(log n)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM