伸展树(splay树),是二叉排序树的一种。【两个月之前写过,今天突然想写个博客。。。】

  伸展树和一般的二叉排序树不同的是,在每次执行完插入、查询、删除等操作后,都会自动平衡这棵树。(说是自动,也就是多了一段代码,把这个节点提到根节点的位置上罢了)

  伸展树的调整是基于两种旋转操作的【左旋右旋嘛】。

  分别是这样的(对2号节点操作):

  

  

  (有点草率啊这个图)

  对于这两个操作,只需要处理好指针为空的情况即可(我的splay树包含了father指针,可能比另一种写法更繁琐一些)

  

 void lec(nod x)
{
nod y=x->fa;
y->rs=x->ls;
if (x->ls!=NULL)
x->ls->fa=y;
x->ls=y;
x->fa=y->fa;
if (y->fa!=NULL)
{
if (y==y->fa->ls)
y->fa->ls=x;
else
y->fa->rs=x;
}
y->fa=x;
} void ric(nod x)
{
nod y=x->fa;
y->ls=x->rs;
if (x->rs!=NULL)
x->rs->fa=y;
x->rs=y;
x->fa=y->fa;
if (y->fa!=NULL)
{
if (y==y->fa->ls)
y->fa->ls=x;
else
y->fa->rs=x;
}
y->fa=x;
}

左旋右旋

  这样的话,我们就可以怼出一个splay操作,每次把一个操作节点上移到根节点位置。

 void splay(nod x)
{
nod y;
while (x->fa!=NULL)
{
y=x->fa;
if (y->fa==NULL)
{
if (y->ls==x)
ric(x);
else
lec(x);
break;
}
if (x==y->ls)
{
if (y==y->fa->ls)
ric(y),ric(x);
else
ric(x),lec(x);
}
else
{
if (y==y->fa->ls)
lec(x),ric(x);
else
lec(y),lec(x);
}
}
s=x;
}

splay操作

  然后只要在每次插入、查找等操作后,加上一句splay(当前结点指针)就好了。。

伸展树(Splay树)的简要操作的更多相关文章

  1. [Splay伸展树]splay树入门级教程

    首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...

  2. 暑假学习日记:Splay树

    从昨天开始我就想学这个伸展树了,今天花了一个上午2个多小时加下午2个多小时,学习了一下伸展树(Splay树),学习的时候主要是看别人博客啦~发现下面这个博客挺不错的http://zakir.is-pr ...

  3. splay树入门(带3个例题)

    splay树入门(带3个例题) 首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. PS:若代码有误,请尽快与本人联系,我会尽快改正 首先引入一下splay的概念,他的中文名 ...

  4. Splay(区间翻转)&树套树(Splay+线段树,90分)

    study from: https://tiger0132.blog.luogu.org/slay-notes P3369 [模板]普通平衡树 #include <cstdio> #inc ...

  5. 树-伸展树(Splay Tree)

    伸展树概念 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造. (01) 伸展树属于二 ...

  6. 伸展树 Splay 模板

    学习Splay的时候参考了很多不同的资料,然而参考资料太杂的后果就是模板调出来一直都有问题,尤其是最后发现网上找的各种资料均有不同程度的错误. 好在啃了几天之后终于算是啃下来了. Splay也算是平衡 ...

  7. 伸展树Splay【非指针版】

    ·伸展树有以下基本操作(基于一道强大模板题:codevs维护队列): a[]读入的数组;id[]表示当前数组中的元素在树中节点的临时标号;fa[]当前节点的父节点的编号;c[][]类似于Trie,就是 ...

  8. 纸上谈兵: 伸展树 (splay tree)[转]

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!  我们讨论过,树的搜索效率与树的深度有关.二叉搜索树的深度可能为n,这种情况下,每 ...

  9. K:伸展树(splay tree)

      伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它能在O(lgN)内完成插入.查找和删除操作.在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使 ...

随机推荐

  1. 谈 jquery中.band() .live() .delegate() .on()的区别

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数 $("a").bind("click",function(){alert(& ...

  2. 前端福利:使用Wallpaper Engine让自己的桌面炫酷起来

    Wallpaper Engine,是一款Steam上的特别特别炫酷的壁纸定制软件.它可以对你的桌面进行定制,可以使用视频,动画,网页等形式来替换壁纸. 注意到没,关键是可以使用Html格式的文件作为桌 ...

  3. 用Less定义常用的CSS3效果函数及常用颜色搭配(让CSS写起来更有趣)

    定义圆角及调用 /* 定义圆角 @radius 圆角大小 */ .round(@radius:5px){ border-radius:@radius; -webkit-border-radius: @ ...

  4. ERP管理员培训报道

    金秋十月,丹桂飘香,为期三天的“201610管理员培训”活动于2016年10月19日在苏州总部成功举行.参与本次培训活动的有浙江卡迪夫电缆有限公司.上海华源瓷业股份有限公司.江苏牛牌纺织机械有限公司. ...

  5. linux 压缩zip包

    压缩: zip -r  名称.zip 被压缩文件 解压: unzip 名称.zip

  6. Tp框架之模型层

    数据模型层是专门针对数据库来操作的 我们在home模块用一下数据模型层 先把配置修改好 我们先来打开这个文件 然后再打开think里面的主配置,把那里面关于数据库的部分,复制到home下的配置文件,然 ...

  7. 获取bing图片并自动设置为电脑桌面背景(C++完整开源程序)

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  8. 某电商网站线上drbd+heartbeat+nfs配置

    1.环境 nfs1.test.com 10.1.1.1 nfs2.test.com 10.1.1.2 2.drbd配置 安装drbd yum -y install gcc gcc-c++ make g ...

  9. 2764: [JLOI2011]基因补全

    2764: [JLOI2011]基因补全 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 570  Solved: 187[Submit][Status ...

  10. 剑指offer_(4)

    重建二叉树: 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍 ...