我无法理解splaying是如何工作的
我无法遵循的部分是我们如何知道:i)zig
ii)zig-zag
或iii)zig-zig
必须完成。
如果我理解正确,这与路径中的当前节点有关
如果它是root的子节点,那么它是zig
否则(ii)或(iii),这取决于当前节点和当前节点的父节点是否都是左(或右)子节点。好的,到目前为止
现在我得不到的部分:
我们向下移动的过程不是将中间节点“移除”到左右子树中的过程,以便我们有一个中间树,最终将成为搜索项目的根目录吗?
然后,如果我们从一棵树开始,我们会不断地进行zig
而不做任何事情,因为我们正在移除元素并且始终位于根部。
例如:
例如,如果我正在寻找20
,我将从根开始向左走。所以当前节点有root作为父节点,我做了一个zig。现在发生了什么?我在26
并向左走,但26
也不是根?我应该做一个zig吗?
但是从我在这个例子中看到的一个曲折现在正在完成,我无法理解为什么
这里有什么帮助吗?
答案 0 :(得分:2)
它们意味着整个树的根,而不是你正在推翻的子树的根。因此,在您的示例中,12是整个树的根。
...
如果您想要一个可以使用的示例,我最近在Java中编写了一个SplayTree。您可以找到代码here。
splay tree的重要一点是它们将最近插入/查询的节点向上(最多)移动到树中的两个级别。您必须根据它的祖父节点和父节点位置执行zig,zig-zig或Zig-zag。
当访问节点x时,对x执行展开操作以将其移动到根。为了执行展开操作,我们执行一系列展开步骤,每个步骤将x移近根部。
三种类型的展开步骤是:(g =祖父,p =父,x =展开节点)
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,则不必显示它,因为它已经位于根位置。