【问题标题】:Why is splay tree in textbook different than mine?为什么教科书中的splay树与我的不同?
【发布时间】:2019-12-01 19:45:37
【问题描述】:

在 Mark Allen Weiss 的 Data Structures and Algorithm Analysis in C++(第 4 版) 中,第 162 页的图 4.50 中,这本书描述了如何将树的最左边的孩子与只有左孩子的展开最终的样子。

我很困惑的是这本书是如何从第 2 步到第 3 步的。以下是第 162 页图 4.50 中突出显示的步骤:

而我的第三步是这样的:

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

我的第四步也是最后一步是这样的:

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

我对这本书如何平衡树感到困惑。对我来说,当 1 超过 4 时,树的底部看起来像这样:

  ...
 /
1
 \
  2
   \
    3
     \
      4

我的逻辑是平衡发生的根是 2。然后你会做一个左旋转,树的底部看起来像这样:

  ...
 /
1
 \
  3
 / \
2   4

我做错了什么,还是我只是以一种不同但同样有效的方式来做这件事?我也很困惑,因为这本书的最后一棵树从 6 的根开始不平衡,而我的 4 的根没有不平衡。

【问题讨论】:

    标签: data-structures binary-search-tree avl-tree treenode splay-tree


    【解决方案1】:

    这主要是向上的“Zig-zig”情况,因此每次您在节点的祖父节点上进行右旋转,然后在父节点上进行右旋转。

    举个例子:

               5                                                                                          
              /                                                  
             4                                                   
            /                                                    
           3                    
          /                                                  
         2
        /
       1
    

    如果要张开 1,则围绕 3 和 2 向右旋转,结果是:

            5                                                                                          
           /                                                  
          4                                                   
         /                                                    
        1
         \
          2
           \
            3                   
    

    由于又是 Zig-Zig 的情况,我们先旋转 5 再旋转 4,结果:

       1
        \
         4
        / \
       2   5
        \
         3     
    

    所以你一直这样做,直到你有 1 作为根。有 3 种情况,Zig-Zig、Zig 和 Zig-Zag。 Here is a tool 将整个概念可视化,我相信它会有所帮助。

    【讨论】:

    • 啊。对于沿一个方向移动的三个节点,您可以以 1 为根反转它们的方向。
    • 它实际上在 3 处向右旋转,使其成为一棵树,其根为 2 和 1 在其左侧,3 在其右侧。然后围绕 2 向右旋转,使 1 成为根,结果如上。
    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多