【问题标题】:Time complexity of right-converting one binary search tree into another将一棵二叉搜索树右转换为另一棵的时间复杂度
【发布时间】:2020-07-19 06:52:38
【问题描述】:

如果可以通过仅对 T1 执行右旋转从 T1 获得 T2,则 BST T1 可以右转换为另一个 BST T2。我需要证明这个操作可以在 $O(n^2)$ 右旋中完成。

假设给定 T1 可以右转换为 T2。 我理解算法的递归性质,因为我们首先将 T2 的根(它必须在 T1 的最左边路径中才能右转换)到 T1 的根,然后重复此过程T1 的 2 个子树。

但是,我无法想出一个演示最坏情况行为的示例。尽管我不确定如何证明这是否是最坏的情况,但我能够想到这两棵树。

 Tree 1                Tree 2 

          6                  1                   
         /                    \                 
        5                      2              
       /                        \               
      4                          3               
     /                            \                  
    3                              4                
   /                                \
  2                                  6
 /                                  /
1                                  5

可以通过从节点 2 开始向右旋转 5+4+3+2 次,将树 1 右转换为 T2。

一般来说,我如何找到需要 $O(n^2)$ 右旋转才能将一个 BST 转换为另一个的情况?

【问题讨论】:

    标签: algorithm recursion time-complexity binary-search-tree


    【解决方案1】:

    校样草图:

    T1=(V,E)n=#V。考虑在以T1 开始的重复(右)旋转过程中发生的树序列<T1 = X_0, X_1, ..., X_(t-1), X_t = T2>。对于任何给定的旋转,让“旋转锚点”表示旋转子树的根节点。

    观察#1:
    旋转任何给定的子树不会改变它的顶点集。

    观察 #2:
    在给定子树的任何右旋转序列s 中,每个顶点最多是一次旋转锚点。 (在每次右旋转中,锚点迁移到右子树中。右旋转后的新根起源于左子树;或者请注意,每次旋转时,右子树都会增长 1 个顶点;因此对于子树@ 987654326@,最多有#V(S)-1 旋转)。

    观察#3:
    右旋转不会改变子树的数量。

    任何树中子树的数量都等于可用根的数量#V-1。因此,最大长度的右旋转序列涉及 O(n) 子树,每个子树最多 #V(S)-1 (= O(n)) 旋转,总共 O(n^2)

    【讨论】:

    • 是的,我想我明白你的意思。您能否提供一个包含最坏情况下旋转次数的树 T1 和 T2 的示例,以便帮助我更好地可视化它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2014-09-24
    • 2021-08-24
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多