为什么教科书上的八角树和我的不一样?

Why is splay tree in textbook different than mine?

C++ 中的数据结构和算法分析(第 4 版) 中,Mark Allen Weiss 在第 162 页的图 4.50 中描述了如何展开最左边的 child只剩下children的树最终看起来像。

我感到困惑的是本书如何从第 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 的根没有不平衡。

这主要是 "Zig-zig" 的情况,直到向上,所以每次你在节点的 grandparent 上进行右旋转,然后在 parent 上进行右旋转。

举个例子:

           5                                                                                          
          /                                                  
         4                                                   
        /                                                    
       3                    
      /                                                  
     2
    /
   1

如果你想张开 1,你先围绕 3 然后 2 旋转,结果是:

        5                                                                                          
       /                                                  
      4                                                   
     /                                                    
    1
     \
      2
       \
        3                   

因为又是 Zig-Zig 的情况,我们先轮换 5,然后轮换 4,结果:

   1
    \
     4
    / \
   2   5
    \
     3     

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