Splay学习笔记

本文介绍了Splay树的基础知识,包括旋转操作、插入和删除节点的过程。通过旋转操作,Splay树能保持其特性,将频繁访问的节点移动到根部,提高查询效率。文章详细讲解了单旋转、双旋转以及Splay操作的实现,并提供了插入和删除节点的步骤,帮助理解Splay树的工作原理。
摘要由CSDN通过智能技术生成

昨天这个时候到现在终于把Splay给搞明白了,还A了一道郁闷的出纳员;刚学完的感受:我再也不碰这东西了;做完郁闷的出纳员的感受:我发誓这辈子不当出纳员(虽然这确实只是个入门题……)
于是来讲一讲这个恶心的东西吧……(全程不用指针,请做好心理准备……)
学习前请先学习下二叉搜索树,里面可能直接用到这个东西
首先,Splay是一个数据结构,为了突出它是一个数据结构,所以给他开个结构体……

struct tree
{
    int val,sz,cnt;//val为值 sz为子树大小,cnt为"有多少这个值"
    //cnt:假如出现了两个一模一样的值,只需要让cnt+1就可以了,cnt是数目
    int s[2],f;//s[0]为左儿子 s[1]为右儿子 f为父亲
};

为了之后的操作,我们再写三个函数(如果认为没用可以先跳过,过一会用到了再回来看)

bool son(int x) //返回x是左儿子还是右儿子,如果为左儿子,返回0,右儿子则返回1
{
    return a[a[x].f].s[1] == x;
}

void rejs(int x)    //重新计算以x为根,子树的大小,子树大小等于左子树大小加右子树大小(好吧我承认我英语拙计)
{
    a[x].sz = a[a[x].s[0]].sz + a[a[x].s[1]].sz + a[x].cnt;
}

void point(int x,int y,bool z)  //在x下面插入y,y是x的z儿子(z为0则左儿子,z为1为右儿子)
{
    a[x].s[z] = y;
    a[y].f = x;
}

写完这几个树的基本函数,我们要开始讲splay啦(似乎我之前好像真的没有开始讲splay)
Splay最重要的一个操作就是旋转(rotate),如下,(图片为1600x900,可直接作为桌面):
这里写图片描述
我们的目的是将红色节点旋转到它父亲的位置,即黄色节点的位置
我们应当怎么办呢?不要急,看组图
这里写图片描述
bool型变量son(黄)代表黄色节点是左儿子还是右儿

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值