自顶向下伸展树。

SplayTree Splay(int e, Position X)
{
    static struct SplayNode Header;
    Position LeftTreeMax, RightTreeMin;
    
    Header.left = Header.right = NullNode;
    LeftTreeMax = RightTreeMin = &Header;
    NullNode->element = e;

    while (e != X->element)
    {
        if (e < X->element)
        {

            if (e < X->left->element)
                X = SingleRotateWithLeft(X);
            if (X->left == NullNode)
                break;
            //将旋转之后的X连接到右侧树上
            RightTreeMin->left = X;
            RightTreeMin = X;
            X = X->left;
        }
        else
        {
            if (e > X->right->element)
                X = SingleRotateWithRight(X);
            if (X->right == NullNode)
                break;

            //后来的x会覆盖之前的啊。
            LeftTreeMax->right = X;
            LeftTreeMax = X;
            X = X->right;
        }
    }
    LeftTreeMax->right = X->left;
    RightTreeMin->left = X->right;
    X->left = Header.right;
    X->right = Header.left;
    return X;
}

这个代码我有个地方不明白:

LeftTreeMax->right = X;
LeftTreeMax = X;

这里,如果我这个树X很深,单旋转了好几次,那么每次旋转不都会把之前保存的给覆盖了,这样最后在连接整理的时候,得到的不就不包含所有的节点。

请大家指教,谢谢~~

这个代码出自数据结构与算法分析,第12章。

阅读 1.9k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进