数据结构与算法-伸展树

介绍

伸展树是一种特殊的二叉查找树,其基本思想是当一个节点被访问后,需要经过一系列的AVL树的旋转操作将该节点推到根节点。伸展树不要求像AVL树那样保留树的高度或者平衡信息,但是可以保证开始连续 M 次对树的操作最多花费O(logN)时间。

展开

展开(splaying)操作是将访问的节点通过一系列旋转变为根节点的过程。假设节点 X 是访问路径上非根节点,X存在父节点 P 和祖父节点G。伸展树的展开操作可以分为自下而上和自上而下的展开过程。
1. 自下而上的伸展过程
如果 X 的父节点P是根节点,则只需要旋转 X 和树根;反之如果,需要考虑两种情况。
第一种情况是之字形,如下图,X位于 G 的左节点的右子树,需要执行AVL双旋操作,同理X位于 G 的右节点的左子树。
这里写图片描述
第二种情况是一字形,如下图2,X位于 G 的左节点的左子树或者其对称的情况,则需要进行如下的操作:先对G执行右旋转,此时 P 作为根节点,然后再对P执行右旋操作,此时 X 成为根节点。
这里写图片描述
通过自下而上的方式需要保存查询路径上各个节点的指针。
2. 自上而下的伸展过程(参考自博客
当自上而下搜索某个节点X的时候,将搜索路径上的节点及其子树移走,并构建两棵临时的树–左树和右树。当前节点 T 作为中树的根;值小于T的节点构成左树;值大于 T 的节点构成右树。其中,右树的左节点始终为null,左树的右节点始终为null,接下来将以图例的方式讲解伸展过程。
当查询位置在节点G时,左树为null,右树为null,中树为 G 为根节点的整棵树,如下图所示。
这里写图片描述
然后向下走,当查询位置为节点P时,左树仍为null,右树为根节点为 G 的部分子树
这里写图片描述
继续向下走,当查询位置为节点X时,左树仍为null,右树包括根节点为 P 的部分子树和根节点为G的部分子树,需要将二者合并成根节点为 P 的子树。
这里写图片描述
最后将现存的左、中、右三颗树合并,并将上图中中树的左子树插入到左树的最右节点,中树的右子树插入到右树的最左节点,完成合并,构成如下的以节点X作为根节点的树。
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值