This earlier question询问是否总是可以将一组BST的一个BST转换为纯粹使用树旋转的同一组值的另一个BST(答案是肯定的)。但是,总是可以使用最多O(n)总树旋转来完成这项工作吗?
答案 0 :(得分:1)
是的,这总是可行的。我担心我现在能做的最好的事情是给你一个愚蠢的算法证明它是可能的,尽管我怀疑必须有一个更好的方法来做到这一点。
Day-Stout-Warren algorithm是一种算法,从任何BST开始,使用树旋转将其转换为完美平衡的BST。它在时间O(n)中运行并且进行O(n)个总旋转。
因此,假设您想使用树旋转将一个树T 1 转换为另一个树T 2 。在两棵树上运行Day-Stout-Warren将它们转换为相同的平衡树T *,并记录在两种情况下需要进行的旋转。然后你可以通过首先运行完美平衡T 1 所需的所有旋转,然后运行反向来将T 1 转换为T 2 将T 2 转换为平衡树所需的旋转。这将T 1 变为T *,然后将T *变为T 2 。由于Day-Stout-Warren算法仅产生O(n)个总旋转,因此这也仅产生O(n)个总旋转。
我觉得必须有一个更好的方法来做到这一点,但我不确定如何实现这一目标。如果我想到什么,我会告诉你的!
答案 1 :(得分:0)
是的,始终可以使用最多O(n)个树旋转将一个BST转换为另一个BST。该答案遵循与其他答案相同的一般方法,方法是选择一些规范树形T *并限制将任意树变为规范树所需的旋转次数。然后,通过将T 1转换为T *,然后将T *转换为T 2,可以将任意树T 1转换为另一棵树T 2。
如评论中所建议,您可以选择规范树作为退化链表。对于n个节点的树,此upper bounds the number of rotations needed at 2n−2。
在论文Rotation Distance, Triangulation, and Hyperbolic Geometry中,Daniel Sleator,Robert Tarjan和William Thurston证明了n个节点的任意两个二叉树之间的旋转距离最大为 2n-6 (大于转换为链表时得到的边界)。
在较高的层次上,他们通过引入一种将任何二叉树表示为polygon triangulation的方式来做到这一点,其中树的旋转具有相应的三角剖分操作。然后,本文不再以二叉树的通常表示方式进行推理,而是选择了规范的 triangulation ,并说明了如何将任意三角剖分转换为其所需的三角剖分。
他们选择的规范三角剖分是所有对角线从单个顶点以扇形形状散发出来的,其最终对应于某种不太直观的二叉树形状(链接列表的一般化,也包括由一个根,一个左孩子(其右孩子是一个链表)和一个右孩子(其左孩子是一个链表)。
这是一个非常酷的技术,它说明了数据结构中等距的力量,表明了改变表示形式如何为我们提供一种解决问题的新方法。如果您想更详细地探讨这一点,我和一些朋友最近将a writeup walking through Sleator, Tarjan, and Thurston's proof汇总在一起。