数据结构期末复习----伸展树

伸展树是一种特殊的排序二叉树,通过频繁的伸展操作保持树的平衡,以降低查找、插入和删除操作的时间复杂度。本文详细介绍了伸展树的基本操作,包括伸展操作、插入和删除,并分析了伸展树的操作时间复杂度,指出在m次伸展操作后,总时间复杂度为O(mlogn+nlogn)。
摘要由CSDN通过智能技术生成

伸展树详解和功能解析

1.什么是伸展树:

从本质上来讲,伸展树是一棵排序二叉树,但是经常要做伸展操作。(这里的经常是真的经常,几乎每一次操作后面都跟着一个伸展操作,所以伸展树的其他基本操作都是基于伸展操作的)

2.伸展树的基本操作:

既然上面提到了伸展树的基本操作,那 伸展树都有哪些基本操作呢?

  1. 伸展操作(Spaly):伸展操作就是将某个节点调整到根。
  2. 插入操作(Insert):向伸展树中插入新节点的操作。
  3. 删除操作(Delete):删除伸展树中存在的元素。
    tips:也有一些其他莫名奇妙的操作,比如输出伸展树中元素num的rank值,查找伸展树中rank值为k的元素等。
3.伸展树基本操作的具体实现
伸展操作:

基本目标:将某个元素x调整到根节点。
但是为了实现这个具体目标要具体分几种情况来讨论一下。
case1: x元素的父节点p为根节点
在这里插入图片描述
就是上图中左侧的情况,当x是根节点p左孩子,对节点x进行伸展操作,伸展后的树结构就是右侧的情况,这里的操作我们叫做左旋
不难发现,在这种情况下,还有一种可能是x节点为根节点p的右孩子,然后做伸展操作,整个情况和上面的左旋操作时对称的,这里就不再贴出。




case2: 元素x的父节点不是根节点。
这里有四个小情况。下面进行讨论。

  1. p是左孩子,x也是左孩子:
    在这里插入图片描述
    如上图左侧,x的父节点p不是根节点,同时x是其父节点p的左孩子,p是其父节点g的左孩子,我们对应进行伸展操作,伸展操作后的树的结构图就是右侧。(这里可能会有人有疑惑,这里一次伸展后x有可能也不在根节点的位置,是的,当树结构较复杂时一次的伸展操作是不能够直接到达根节点的位置的,这时就要进行多次伸展操作调整到根节点的位置)

  2. p是右孩子,x是p的右孩子。
    这是第二种情况,第二种情况显然和第一种情况是对称的。这里就不作详细解释了。

  3. p是左孩子,x是p的右孩子。
    在这里插入图片描述
    上图中左侧就是p是左孩子,x是p的右孩子的情况。经过伸展后的树的结构就是右侧的图。

  4. p是右孩子,x是p的左孩子。
    这个情况和第三种情况是对称的,这里也不再赘述。

比较显然:上面在进行伸展操作时,经过若干个伸展操作到达根节点。如果节点x距离根的距离为≥2,那么每次伸展操作,和根的距离减小2,如果离根的距离≥1,每次伸展后和根的距离减少1。

插入操作(Insert):

这里插入类似于二叉查找树,但是我们对插入的节点要伸展到根的位置。

删除操作(Delete):

同样和二叉查找树类似,但是我们对插入后的节点要伸展到根的位置。

从上面每个操作后面都跟上一个伸展操作可以看出对于伸展树来说,近期被访问的节点都会被放在靠近根的位置,从而达到相对平衡,这样均摊时间复杂度会较低。

4.时间复杂度分析:
定理1:假设最多有n个节点,在进行m次伸展操作后,所花费的总时间是 O ( m l o g n + n l o g n ) O(mlogn+nlogn) O(mlogn+nlogn)

思路1:直接证明 c 1 + c 2 + c 3 + , , , + c m c_{1}+c_{2}+c_{3}+,,,+c_{m} c1+c2+c3<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值