我需要帮助理解splay树中zig-zag和zig-zig旋转的具体示例。我已经在一本书,维基百科以及其他一些在线资源上阅读过它们,虽然当它们应用于简单的树(即节点很少的树)时我可以理解它们,但是当我看到示例时我会迷失方向它们应用于更大的树木(即具有更多节点的树木)。
特别是,我不明白这两个例子中的至少一个:
示例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次轮换。
在该示例中,展开操作涉及zig-zig。如您所见,只有1次旋转。然后有第二个splay,因为被访问的节点仍然不在根位置。
我在此期望的是:
如果这两个例子中的任何一个出错,你能告诉我吗?哪一个?如果他们都没有错,我错在哪里?
感谢您的帮助。
PS:因为很明显我是学生,所以我想告诉你我在作业的背景下不问这个问题,因此我不是在作弊。不过,我将在周一参加考试,希望在参加考试之前澄清任何误解。答案 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操作都有对称的对应物。)