008-数据结构-树形结构-二叉查找树-伸展树

一、概述

  伸展树(Splay Tree)是特殊的二叉查找树。

  它的特殊是指,它除了本身是棵二叉查找树之外,它还具备一个特点: 当某个节点被访问时,伸展树会通过旋转使该节点成为树根。这样做的好处是,下次要访问该节点时,能够迅速的访问到该节点。

  AVL树为了保持严格的平衡,所以在数据插入上会呈现过多的旋转,影响了插入和删除的性能。从访问量上,我们知道许多应用场景都有一个“二八原则“,也就是说80%的人只会用到20%的数据,比如说我们的用的输入法,平常打的字也就那么多,或许还没有20%呢。

二、详细说明

旋转是伸展树中需要重点关注的

将"键值为key的节点"旋转为根节点,并返回根节点。它的处理情况共包括:
(a):伸展树中存在"键值为key的节点"。
        将"键值为key的节点"旋转为根节点。
(b):伸展树中不存在"键值为key的节点",并且key < tree->key。
        b-1) "键值为key的节点"的前驱节点存在的话,将"键值为key的节点"的前驱节点旋转为根节点。
        b-2) "键值为key的节点"的前驱节点存在的话,则意味着,key比树中任何键值都小,那么此时,将最小节点旋转为根节点。
(c):伸展树中不存在"键值为key的节点",并且key > tree->key。
        c-1) "键值为key的节点"的后继节点存在的话,将"键值为key的节点"的后继节点旋转为根节点。
        c-2) "键值为key的节点"的后继节点不存在的话,则意味着,key比树中任何键值都大,那么此时,将最大节点旋转为根节点。 

2.1、说明

在下面的伸展树中查找10,,共包括"右旋" --> "右链接" --> "组合"这3步。

  

01, 右旋
对应代码中的"rotate right"部分

  

02, 右链接
对应代码中的"link right"部分

  

03. 组合
对应代码中的"assemble"部分

  

代码地址:地址 中的data-004-tree中 SplayTree

2.2、示例

  

猜你喜欢

转载自www.cnblogs.com/bjlhx/p/10875266.html