是否可以在仅On<比较的情况下,提取<上针对二分搜索树的有序前序和后序?

问题描述

假设一个具有二元搜索树B,它在具有严格顺序关系<和n个元素的某些域D上不一定是平衡的。

鉴于B提取的前订单项R,后订单项T:

  1. 是否可以在不访问<的情况下在O(n)中计算B的有序S?
  2. 是否可以仅使用与<的O(n)比较来计算B的有序S?
  3. 还可以计算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”中。我们可以避免线性比较,因为我们可以结合许多相等性检查来利用输入的结构,以至少局部地部分重建二叉搜索树的原始结构。但是,我看不到如何在不到线性时间内提取每个子树的大小。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...