数据结构之伸展树(一)(Splay Tree)

Splay树是一棵二叉搜索树(BST),它是BST的拓展,它不仅拥有O(log n)的单点插入、删除、查找等,还可以在O(log n)的复杂度内对区间进行插入、删除等~

它具有BST的性质,即一个节点的键值必然大于其左子树所有节点的键值,并且必然小于其右子树所有节点的键值。关于BST,详见: 百度百科:二叉搜索树

SPT不同于BST,就在于它有伸展操作——这使得在某些情况下(比如区间的插入、删除等),SPT更优

提到伸展操作前必定要先说左旋(Zip)和右旋(Zap):

左旋Zip就是将左子节点变为父节点,父节点变为左子节点的右儿子,左子节点原来的右儿子变为父节点的新的左儿子,即:

然后右旋Zap就是和左旋相反了,将右子节点变为父节点,父节点变为右子节点的左儿子,右子节点原来的左儿子变为父节点新的右儿子,在上图也有~~

说完左旋和右旋,就可以说伸展(Splay)了~

学过AVL树的都知道旋转分为单旋和双旋,SPT也有单旋和双旋。单旋也就是上面的左旋或者右旋,而双旋分为一字旋和之字旋。一字旋就是左旋+左旋,或者右旋+右旋,之字旋就是左加右或者右加左。这三种旋转分别对应以下三种情况:

单旋:被访问的节点的父节点为根节点

一字旋:被访问的节点为其父节点的左儿子,并且父节点也为其爷爷节点的左儿子,或者被访问的节点为其父节点的右儿子,并且其父节点也为其爷爷节点的右儿子

之字旋:被访问的节点为其父节点的左儿子,并且父节点也为其爷爷节点的右儿子,或者被访问的节点为其父节点的右儿子,并且其父节点也为其爷爷节点的左儿子

上面都是简单介绍,重点在下面~~

伸展树可以非常方便的对区间进行修改,时间复杂度仅为O(log n)~

简单思路是比如要删除区间 [l,r],就将l-1伸展到根节点,r+1伸展到根节点的右子节点,然后显然:根节点的右儿子的左子树就是区间[l,r]——因为伸展树是二叉搜索树,满足二叉搜索树的特性,根节点的右子树大于根节点l-1,即根节点的右子树表示[l,~],而根节点的右儿子的左子树都小于根节点的右儿子r+1,所以根节点的右儿子的左子树表示[l,r]

具体怎么实现见伸展树(二),后来真正会用Splay后再写的一篇伸展树的博客~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值