问题描述
假设一个具有二元搜索树B,它在具有严格顺序关系<
和n个元素的某些域D上不一定是平衡的。
鉴于B提取的前订单项R,后订单项T:
- 是否可以在不访问
<
的情况下在O(n)中计算B的有序S? - 是否可以仅使用与
<
的O(n)比较来计算B的有序S? - 还可以计算O(n)总数中的S吗?
注意:这是已删除的未答复question 的重新发布。
解决方法
1。无关联的<
这是不可能的,如Why it is impossible to construct Binary Tree with Pre-Order,Post Order and Level Order traversals given?中所述。简而言之,输入R = cba,T = abc是模棱两可的,并且可能源于这两个树:
a a
/ \
b b
\ /
c c
S = bca S = acb
2。 O(n)比较中的顺序
使用<
关系,尽管可以产生相同的前序R和后序T,但可以像上面一样突然区分树木。
R = Ca
使用C
的{{1}}的子节点的任意非空范围,其中C = u ... v(即,范围以u开头,以v结尾),可以得出以下结论:
a
在(1)和(2)中的递归是微不足道的,我们花了O(1)
(1) a < u -> a has 1 direct child (to its right) -> all children are greater than a
(2) v < a -> a has 1 direct child (to its left) -> all children are less than a
(3) otherwise -> a has 2 direct children
其中X和Y是任意序列。我们可以将其分为递归步骤:
R = XbYca
T = abXcY
请注意,这不需要与 R = XbYca
T = abXcY
/ \
R = Xb R = Yc
T = bX T = cY
进行比较,但是需要拆分两个范围。由于X和Y的长度不必相同,因此找到分割点要求我们在R中找到b,这对于递归树的每个级别都可以在O(n)中完成。因此,总共需要进行O(n * d)个相等比较,其中<
是原始二进制搜索树B(以及反映B的递归树)的深度。
在每个递归步骤中,我们最多使用2个d
比较,得出范围的一个元素,因此我们不能使用超过2 * n <
个比较(在O(n)中) )。
3。总共O(n)次有序
在上面给出的算法中,问题是如果不能负担所有元素的查找表,那么找到包含所有子元素的范围的分割点将比在线性时间内更好。
但是,如果在其上定义B的宇宙足够小,从而能够为所有条目创建索引表,则可以在O(n)中预先解析R(例如<
)并创建一个像这样的表:
R = xbyca
只有在可行的情况下,才能使用2中描述的算法实现整体O(n)。它占用O(2 ^ D)空间。
是否有可能在O(n)中生成有序S。
我没有这方面的证据,但认为不可能。理由是该问题与比较排序太相似,而 不能比线性节奏更好。
在“ 2”中。我们可以避免线性比较,因为我们可以结合许多相等性检查来利用输入的结构,以至少局部地部分重建二叉搜索树的原始结构。但是,我看不到如何在不到线性时间内提取每个子树的大小。