我不明白摊位是怎么工作的。
我不能理解的部分是我们如何知道a:i)zigii)zig-zag或iii)zig-zig是否必须完成。
如果我理解正确,这与路径中的当前节点有关。
如果它是根的子节点,则它是一个zig否则(ii)或(iii)取决于当前节点和当前节点的父节点是否都是左(或右)子节点到目前为止还可以。
现在我不明白的是:
当我们向下移动时,不是要将中间节点“移除”到左子树和右子树中,这样我们就有了一个中间树,它最终将成为搜索项的根吗?
如果我们从一棵树开始,我们将继续执行zig操作,而不执行其他操作,因为我们正在删除元素,并且始终位于根目录。
例子:
例如,如果我要查找20,我将从根开始向左所以当前节点有根作为父节点,我做一个zig。现在怎么办??我在26左行,但26不也是根吗所以我应该做一个“之”字吗?
但从我在这个例子中看到的是一个曲折的过程,我不明白为什么。
有什么帮助吗?

最佳答案

它们指的是整棵树的根,而不是你所展示的子树的根所以,在你的例子中,12是整棵树的根。
...
如果你想用一个例子,我最近用java编写了一个splaytree。你可以找到代码here
splay tree的最大特点是它们将最近插入/查询的节点向上(最多)移动树中的两个级别。必须根据父节点和父节点的位置执行之字形、之字形或之字形。
当访问节点x时,对x执行splay操作以将其移动到根节点。为了执行splay操作,我们执行一系列splay步骤,每个步骤都将x移近根。
展开步骤的三种类型是:(g=父级,p=父级,x=节点到展开)
zig步骤:当p是根时执行此步骤。树是旋转的
在x和p之间的边缘。
zig-zig步骤:当p
不是根和x和p都是正确的子项
两个孩子都离开了树在连接p的边上旋转
其父g,然后在边上旋转,将x与p连接起来。
曲折步:当p不是根,x是一个正确的子级时,这个步骤就完成了。
p是一个左孩子,反之亦然树在边缘旋转
在x和p之间,然后在x和它的新边之间旋转
母公司G.
http://en.wikipedia.org/wiki/Splay_tree
下面是树中节点3的显示。
展开前的树:

└── 0
    └── (right) 9
        └── (left) 7
            ├── (left) 5
            │   ├── (left) 1
            │   │   └── (right) 2
            │   │       └── (right) 4
            │   │           └── (left) 3
            │   └── (right) 6
            └── (right) 8

在(右->左)到节点3的曲折之后。
└── 0
    └── (right) 9
        └── (left) 7
            ├── (left) 5
            │   ├── (left) 1
            │   │   └── (right) 3
            │   │       ├── (left) 2
            │   │       └── (right) 4
            │   └── (right) 6
            └── (right) 8

在另一个(左->右)之字形到节点3。
└── 0
    └── (right) 9
        └── (left) 7
            ├── (left) 3
            │   ├── (left) 1
            │   │   └── (right) 2
            │   └── (right) 5
            │       ├── (left) 4
            │       └── (right) 6
            └── (right) 8

在(左->左)到节点3的zig之后。
└── 0
    └── (right) 3
        ├── (left) 1
        │   └── (right) 2
        └── (right) 7
            ├── (left) 5
            │   ├── (left) 4
            │   └── (right) 6
            └── (right) 9
                └── (left) 8

在(右)到节点3的Zig之后现在该停止了,因为3在根位置。
└── 3
    ├── (left) 0
    │   └── (right) 1
    │       └── (right) 2
    └── (right) 7
        ├── (left) 5
        │   ├── (left) 4
        │   └── (right) 6
        └── (right) 9
            └── (left) 8t) 6
                └── (right) 9
                    └── (left) 8

如果在树中再次尝试访问节点3,则不必将其展开,因为它已经位于根位置。

07-26 09:34