Splay树:zig-zig和Zig-zag旋转如何工作,详细信息?

时间:2016-12-16 12:58:13

标签: data-structures splay-tree

我需要帮助理解splay树中zig-zag和zig-zig旋转的具体示例。我已经在一本书,维基百科以及其他一些在线资源上阅读过它们,虽然当它们应用于简单的树(即节点很少的树)时我可以理解它们,但是当我看到示例时我会迷失方向它们应用于更大的树木(即具有更多节点的树木)。

特别是,我不明白这两个例子中的至少一个:

示例1

Splay example 1 (这不是完整的例子,但这是我不明白的部分)

我们可以在(1)中看到即将展开的节点是左孩子的右孩子,因此我们必须做一个锯齿形。因此,我可以理解在(1)和(2)之间发生的事情,其中​​显示的节点现在取代了它的父节点。根据我的理解,整个之字形操作都在那里进行。所以第一个splay结束了,我们仍然需要显示节点,直到它位于树的根部。

我不明白(2)和(3)之间发生了什么。在(2)中,展开的节点是左子节点的左子节点,因此我期望Zig-zig操作,其中展开的节点围绕其祖父节点旋转,即(20,Z)。相反,幻灯片显示其父项(10,A)的旋转。为什么?我所期望的是,我们的展开节点(8,N)做一个zig-zig,从而取得(20,N)的祖父母的位置,以及根。为什么父母会参与呢?

在我找到这个例子的资源中(我的讲师的幻灯片),Z字形旋转被描述为“与其父节点一起旋转节点,然后用其父节点旋转节点”。那是怎么回事?这就是为什么(2)和(3),(8,N)之间用(10,A)而不是(20,Z)旋转的原因?

我对此描述非常困惑,因为之后zig-zig旋转被描述为“旋转节点及其祖父,然后旋转节点及其父节点”。但是,每当我看到一个zig-zig旋转的例子时,总是只有一个旋转与节点的祖父,那就是它。我从未见过2次轮换。

然后是另一个例子: Splay example 2

在该示例中,展开操作涉及zig-zig。如您所见,只有1次旋转。然后有第二个splay,因为被访问的节点仍然不在根位置。

我在此期望的是:

  • 提供的zig-zig和zig-zag的描述是正确的,因此在第二个例子中会有2次旋转:一个围绕着祖父母的节点,一个围绕其父节点。
  • 或者,提供的描述是错误的,所以第二个例子是正确的,但第一个例子不是因为我们用它的父节点旋转节点而不是它的祖父母,而它是在Zig-zig位置。

如果这两个例子中的任何一个出错,你能告诉我吗?哪一个?如果他们都没有错,我错在哪里?

感谢您的帮助。

PS:因为很明显我是学生,所以我想告诉你我在作业的背景下不问这个问题,因此我不是在作弊。不过,我将在周一参加考试,希望在参加考试之前澄清任何误解。

1 个答案:

答案 0 :(得分:0)

节点 x 展开步骤序列,直到 x 成为树的根。这些步骤是zig,zag和zig-zag。

对于节点 x ,其父 p p 的父 g ,<节点 x 上的strong> zig-zag 操作是针对 p 不是根且 x 是正确的情况定义的 p p 的子项是 g 的左子项:首先向左旋转 x ,然后向右旋转 X 。您的第一个示例正好显示了这种情况:zig向左旋转 x =(8,X),其父 p =(7,T),然后zag向右旋转(8, X)和 g =(10,A)。因此,此示例在 x 上显示zig-zag,但是splaying本身未完成,因为 x 还不是root(意味着需要更多的展开步骤)。

zig-zig 是针对 x p 都是其各自父母的正确子女的情况定义的:首先向左旋转 p ,然后向左旋转 x 。第二个示例的第二张图显示了 x =(40,X)上的zig-zig结果, p =(37,P), g < / em> =(35,R):向左旋转 p ,然后向左旋转 x 。第二个示例的第三张图片显示了 x 上的附加zig操作(左旋 x ,因为它的父 p 是根)移动到根和完成 x 的推广。

(所有zig,zig-zig和Zig-zag操作都有对称的对应物。)