首页 > 其他 > 详细

伸展树(Splay Tree)

时间:2018-01-30 22:02:08      阅读:275      评论:0      收藏:0      [点我收藏+]

伸展树是一种自平衡二叉查找树,它将每次操作的节点都旋转到根节点,伸展树操作的均摊时间复杂度为logn

基本操作

伸展操作

  伸展树的最基本的操作当然就是伸展了,这也是它自平衡的基础
  splay(x,S)表示在保持伸展树有序性的前提下,通过一系列旋转将伸展树S中的元素x调整至树的根部。

  旋转操作就不说了

  技术分享图片

  伸展操作大致分为3种情况(左右对称的算一种)

    1. x的父亲节点就是根节点:
      这时我们只需要单次旋转(x如果是左子节点就右旋,是右子节点就左旋)将x旋转到根即可
    2. x的父亲节点和x同为左节点(右节点),如下图中x为4的情况:
      技术分享图片

      这时我们先将父节点旋转到爷爷节点
      技术分享图片

      然后再将x旋转到父节点
      技术分享图片

      这样x就向上移了两层,然后再进行判断并继续上移直到x为根节点

    3. x为右子节点但x父亲为左子节点或x为左子节点但x父亲为右子节点,如下图x为5的情况:
      技术分享图片

      这时,可以先将x旋转到父节点
      技术分享图片

      然后将x旋转到之前的爷爷节点
      技术分享图片

      这样x也向上移了两层,然后再进行判断并继续上移直到x为根节点

  下面是旋转操作和伸展操作的代码(代码中将伸展操作中2,3情况的旋转分开了,也可以将旋转合并成一次操作)

插入操作

   插入操作和二叉查找树的相同,只是插入过后执行伸展操作将节点旋转到根节点

伸展树(Splay Tree)

原文:https://www.cnblogs.com/bennettz/p/8387220.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!