伸展树学习小结
2016-01-28 12:36
316 查看
伸展树实际上就是一种二叉搜索树,只不过它采用了一个理念:刚刚访问过的数据很可能再次被访问,于是,为了在概率上提高多次查找效率,它采用了一种简单粗暴的方法,即把刚刚访问过的节点移动到根节点的位置。这与我们以前学过的平衡二叉树有异曲同工之妙,都是为了保证效率而对树结构进行重构。下面我们看一下这种重构是怎么实现的。
假设要查找的节点是X,其父节点为Y(如果存在),父节点的父节点为Z(如果存在)
1. X的父节点Y为根节点。以X为轴,顺时针旋转Y,X的右孩子(如果存在)变为Y的左孩子,Y变为X的右孩子,其余不变。
![](https://img-blog.csdn.net/20160128122547794?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2. X、Y、Z呈“一”字形结构。以X为轴,顺时针旋转Y,Z,Y的右孩子变为Z的左孩子,X的右孩子变为Y的左孩子,Y变为X的右孩子,Z变为Y的右孩子。
![](https://img-blog.csdn.net/20160128122908048?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3. X、Y、Z呈“之”字形结构(都这么叫,但我觉得一点也不像。。。)。这种形式需要先转换为“一”字形结构,再按“一”字结构转换。首先逆时针旋转XY这条边,使Y成为X的左孩子,X的左孩子为Y的右孩子,X为Z的左孩子,再按照“一”字形转换即可。
假设要查找的节点是X,其父节点为Y(如果存在),父节点的父节点为Z(如果存在)
1. X的父节点Y为根节点。以X为轴,顺时针旋转Y,X的右孩子(如果存在)变为Y的左孩子,Y变为X的右孩子,其余不变。
2. X、Y、Z呈“一”字形结构。以X为轴,顺时针旋转Y,Z,Y的右孩子变为Z的左孩子,X的右孩子变为Y的左孩子,Y变为X的右孩子,Z变为Y的右孩子。
3. X、Y、Z呈“之”字形结构(都这么叫,但我觉得一点也不像。。。)。这种形式需要先转换为“一”字形结构,再按“一”字结构转换。首先逆时针旋转XY这条边,使Y成为X的左孩子,X的左孩子为Y的右孩子,X为Z的左孩子,再按照“一”字形转换即可。
相关文章推荐
- 命令行快速技巧:如何定位一个文件
- C#实现字体旋转的方法
- jquery+CSS实现的多级竖向展开树形TRee菜单效果
- 基于jQuery实现的旋转彩圈实例
- C++实现一维向量旋转算法
- 使用JavaScript实现旋转的彩圈特效
- cmd tree命令 以树形格式罗列文件
- jQuery平滑旋转幻灯片特效代码分享
- jquery实现可旋转可拖拽的文字效果代码
- jQuery+CSS3实现3D立方体旋转效果
- 推荐8款jQuery轻量级树形Tree插件
- C#中图片旋转和翻转(RotateFlipType)用法分析
- tree 以树形格式罗列文件
- EasyUI Tree+Asp.net实现权限树或目录树导航的简单实例
- E3 tree 1.6在Firefox下显示问题的修复方法
- js树形控件脚本代码
- Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- Javascript实现可旋转的圆圈实例代码
- Android编程实现3D滑动旋转效果的方法