一、伸展树简介

伸展树与AVL树一样,也是一种特殊的二叉查找树。

通常,我们对数据的访问具有一定得局部性:即是刚刚被访问过的数据,极有可能很快的被再次访问。这在信息的处理过程中很常见。对应到二叉查找树中,也就是说,刚刚被访问过的结点,很有可能很快会被再次访问。或者说,下一次将要访问的结点很可能就在刚刚被访问过的结点的附近。

对于一颗规模为N的AVL树来说,连续的m次查找访问(m>>N),共需要的时间为m*logN。如果利用了局部性,在某些情况下能够达到更快的速度。

伸展树就是一种利用了局部性的二叉查找树。

如上图所示,伸展树的基本思想就是,每一次访问一个结点之后,都通过一系列的等价变换将该结点的位置提升到的树的根结点位置上。这与自适应链表类似。这里所谓的等价变换实质上与AVL树中的旋转操作一样。

将结点v通过等价变化最终成为根结点的这一个过程就称之为伸展(Splay)。

想当然的,一种基本的伸展方式就是逐层伸展,即结点总是一层一层的向上爬,每一次都是通过一次单旋从而将位置向上提高一层。然而,如果总是采用逐层伸展的方式,那么在最坏情况下的性能是我们相当不愿意看到的。

下面以一个例子说明最坏情况下采用逐层伸展的结果:

假设二叉树退化成了图中所示的一条单链

此时,我们对树中最深的结点1进行访问,将会引起一系列的rotateRight旋转操作,并最终使结点1成为了根结点

接着,我们再次访问树中最深的结点2,这同样会引起一系列的旋转操作,并最终使结点2到达了根结点的位置

以同样的方式,我们依次访问结点3、4、5、6、7,每一次访问之后树的结构分别如下图所示

可见,在经过一系列的访问之后,树的结构仍然是退化为了类似于单链的形式。

在这种最坏情况下的性能是令人难以忍受的。

为了能够解决这个问题,需要作出的改变并不多。即是每一次向上伸展时,一次就向上追溯两层,而非一层。除非该节点的父节点是树根,从而没有祖父节点。

在子孙异侧时,即如下图所示情况时,双层伸展与逐层伸展并没有什么不同,即此时的旋转操作与AVL树中的旋转完全相同。

然而,在子孙同侧时,双层伸展则能避免最坏情况一直延续下去。

下面以一个例子说明,仍然是一条退化为一条单链的二叉树,如下图所示

对结点1进行访问,并采用双层伸展,伸展过程中树的结构如图所示,只给出了前面两次变换的详细过程以及最终的结构,中间的省略了。

可见,利用双层伸展,在对结点1进行访问之后,树的深度大致减低了一半。并且可以避免最坏情况的持续发生。

只是,在进行双层伸展时,需要注意一个特殊情况,即结点v的父节点就是根结点,没有祖父结点。这种情况在一次伸展过程中最多只会出现一次,且只有当结点v的深度为奇数时才会出现。遇到这种特殊情况,只需要简单的做一次单旋转就可以了。

二、Java实现

数据结构(六):伸展树简介相关推荐

  1. 伸展树算法c语言,数据结构之伸展树详解

    1. 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Binary Sort Tree)能够支持多种动态集合操作,它可以用来表示有序集合.建立索引等,因而在实际应用中,二叉排 ...

  2. PHP算法 《树形结构》 之 伸展树(1) - 基本概念

    伸展树的介绍 1.出处:http://dongxicheng.org/structure/splay-tree/ A. 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Bin ...

  3. 数据结构思维 第六章 树的遍历

    第六章 树的遍历 原文:Chapter 6 Tree traversal 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章将介绍一个 Web 搜索引擎,我们将在本书其余部分开 ...

  4. 高级数据结构实现——自顶向下伸展树

    [0]README 1) 本文部分内容转自 数据结构与算法分析,旨在理解 高级数据结构实现--自顶向下伸展树 的基础知识: 2) 源代码部分思想借鉴了数据结构与算法分析,有一点干货原创代码,for o ...

  5. 数据结构--伸展树(伸展树构建二叉搜索树)-学习笔记

    2019/7/16更新:封装SplayTree进入class:例题:http://poj.org/problem?id=3622 一个伸展树的板子: #include<stdio.h> # ...

  6. 伸展树算法c语言,数据结构伸展树介绍及C语言的实现方法

    概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...

  7. 数据结构与算法专题——第十题 输入法跳不过的坎-伸展树

    我们知道AVL树为了保持严格的平衡,所以在数据插入上会呈现过多的旋转,影响了插入和删除的性能,此时AVL的一个变种伸展树(Splay)就应运而生了,我们知道万事万物都遵循一个"八二原则&qu ...

  8. C++(数据结构与算法):52---平衡搜索树之分裂树/伸展树

    一.分裂树简介 当使用AVL树或红黑树来实现字典时,最坏情况下,每一个字典操作的时间复杂性是字典大小的对数.在已知的数据结构中,没有一个会提供更好的性能.然而,在字典的很多实际应用中,令我们更感兴趣的 ...

  9. 《大话数据结构》第六章 树

    文章目录 第六章 树 树的定义 结点的分类 树的抽象数据类型 树的存储结构 双亲表示法 孩子表示法 孩子兄弟表示法 二叉树 特殊二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 遍历 ...

最新文章

  1. mysql分组取日期最大的记录_mysql 分组 group by, 排序 取每条记录中,时间最大
  2. 互斥体CMutex的使用
  3. JDK+Tomcat搭建JSP运行环境--JSP基础
  4. 你一写长文章就焦虑拖延?
  5. 给微软的依赖注入框架写一些扩展方法
  6. Glib2之无法添加符号: DSO missing from command line(十九)
  7. 组策略下更改本地管理员名称和密码
  8. vue-cropper 自定义旋转任意角度
  9. 使用向导进行MFC程序设计
  10. pdf批量盖章软件_我的PDF休要乱用 超实用的PDF批量加水印神器 它来了
  11. r去掉向量中的空字符串 在R里如何去掉字符串矩阵中的空字符串 r r 识别字符串中的双引号 识别字符串中的双引号 str_detect
  12. Android应用系列:手把手教你做一个小米通讯录(附图附源码)
  13. 威漫哨兵机器人_漫威哨兵机器人真的可以模仿所有超能力吗?
  14. 【Android】软件开发中遇到的LUT
  15. ad16自动布线设置规则_pcb自动布线设置_设置线间距与宽度设置_pcb布局布线技巧...
  16. Postman学习_Sinno_Song_新浪博客
  17. Android下修改hosts文件-重启有效
  18. 边缘计算:电信运营商5G时代战略转型的关键一步
  19. 服务器端获取表单数据
  20. 部门名称部门结构叠用_部门名称简写

热门文章

  1. Petya and Strings
  2. Java-根据IP获取对应位置信息
  3. 蓝桥杯刷题,第四界省赛B组
  4. java web 系统消息通知功能,实现实时弹窗
  5. 中职网络安全操作系统渗透
  6. 移动硬盘突然识别不了!
  7. 主流智能手机屏幕材质介绍
  8. WiFi、蓝牙、NFC哪家强?短距离无线通信技术对比分析
  9. 17.项目开发中遇到的问题(this.$parent.$parent子组件调父组件的父组件的方法不可用问题)
  10. API接口:公司信息查询在线工具应用