展开树是一种自调整二叉搜索树。将节点插入展开树涉及将其作为叶子插入二叉搜索树中,然后通过“展开”操作将该节点带到根。
如果可以通过以某种顺序将其元素插入到最初为空的展开树中来生成二叉搜索树,那么我们就说二叉搜索树是“展开构造的”。
并非所有二叉搜索树都是可展开构造的。例如,下面是一个最小的不可展开构造的二叉搜索树:
给定二叉搜索树,确定它是否可展开构造的有效算法是什么?
这个问题的灵感来自关于 AVL 和 splay 树之间一致性的相关问题。
更多细节:我有代码可以从给定的序列生成一个展开树,所以我可以在 O(n!log(n)) 时间左右执行蛮力测试,但我怀疑多项式时间性能可以使用某种形式树结构上的动态规划。据推测,这样的算法将利用这样一个事实,即每个大小为n的展开构造树都可以通过将当前根插入到一些大小为n-1的展开构造树中来产生,然后做一些事情来利用重叠/同构子问题。