数据结构与算法-伸展树

来源:互联网 发布:github php开源项目 编辑:程序博客网 时间:2024/06/05 15:58

介绍

伸展树是一种特殊的二叉查找树,其基本思想是当一个节点被访问后,需要经过一系列的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作为根节点的树。
这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 联程火车票晚点怎么办 虎皮剑兰发很多怎么办 一直换号码骚扰怎么办 冰箱不停的运作怎么办 被虚拟电话骚扰怎么办 一直有电话骚扰怎么办 老打电话骚扰我怎么办 总有电话骚扰怎么办 狗一直抽搐不停怎么办 右眼皮一直抽搐怎么办 打包机不停的倒带不切带怎么办 频繁被电话骚扰怎么办 一直被骚扰电话怎么办 有电话短信骚扰怎么办 收到大量验证码怎么办? 每天有陌生电话怎么办 电话不停被骚扰怎么办 水龙头的乱溅怎么办 水龙头坏了喷水怎么办 水龙头水流很散怎么办 自来水往外喷水怎么办 手机有骚扰电话怎么办 半夜到南宁机场怎么办 得了水痘坐火车怎么办 香港账户被限制怎么办 司法拍卖车扣分怎么办 速递易已超期怎么办 e栈快递换微信怎么办 e栈快递柜打不开怎么办 小孩耳朵塞东西怎么办 把隐形眼镜吃了怎么办 街道分车位不公平怎么办 服务区修车被宰怎么办 2018高速逃费怎么办 高速不停车卡怎么办 独立显卡显存不够怎么办 rx470d买不到了怎么办? 南方避险基金到期怎么办 高铁票认证失败怎么办 高铁票三个小孩怎么办 12306取消三次后怎么办