无法弄清楚splaying是如何工作的

时间:2012-05-29 20:53:48

标签: algorithm data-structures binary-tree binary-search-tree splay-tree

我无法理解splaying是如何工作的 我无法遵循的部分是我们如何知道:i)zig ii)zig-zag或iii)zig-zig必须完成。
如果我理解正确,这与路径中的当前节点有关 如果它是root的子节点,那么它是zig否则(ii)或(iii),这取决于当前节点和当前节点的父节点是否都是左(或右)子节点。好的,到目前为止 现在我得不到的部分:
我们向下移动的过程不是将中间节点“移除”到左右子树中的过程,以便我们有一个中间树,最终将成为搜索项目的根目录吗? 然后,如果我们从一棵树开始,我们会不断地进行zig而不做任何事情,因为我们正在移除元素并且始终位于根部。
例如:
enter image description here
例如,如果我正在寻找20,我将从根开始向左走。所以当前节点有root作为父节点,我做了一个zig。现在发生了什么?我在26并向左走,但26也不是根?我应该做一个zig吗? 但是从我在这个例子中看到的一个曲折现在正在完成,我无法理解为什么 这里有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

它们意味着整个树的根,而不是你正在推翻的子树的根。因此,在您的示例中,12是整个树的根。

...

如果您想要一个可以使用的示例,我最近在Java中编写了一个SplayTree。您可以找到代码here

splay tree的重要一点是它们将最近插入/查询的节点向上(最多)移动到树中的两个级别。您必须根据它的祖父节点和父节点位置执行zig,zig-zig或Zig-zag。

当访问节点x时,对x执行展开操作以将其移动到根。为了执行展开操作,我们执行一系列展开步骤,每个步骤将x移近根部。

三种类型的展开步骤是:(g =祖父,p =父,x =展开节点)

  • Zig步骤:当p是根时,完成此步骤。树旋转 在x和p之间的边缘。
  • Zig-zig步骤:此步骤在p完成 不是根,x和p都是正确的孩子或者是 都留下了孩子。树在连接p的边缘上旋转 它的父g,然后在与p连接的边缘上旋转。
  • Zig-zag步骤:当p不是根且x是右子时,完成此步骤 和p是左孩子,反之亦然。树在边缘旋转 在x和p之间,然后在x和它之间的边缘上旋转 父母g。

http://en.wikipedia.org/wiki/Splay_tree

下面是树中节点3的展示。

splaying之前的树:

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

在(右 - >左)Zig-Zag到节点3之后。

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

在另一个(左 - >右)Zig-Zag到节点3之后。

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

在(左 - >左)Zig-Zig到节点3之后。

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

在(右)Zig到节点3之后。现在是时间停止,因为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,则不必显示它,因为它已经位于根位置。

相关问题