0%

Splay Tree-II

Splay的插入操作

正如前篇博文所讲的,Splay树是一种自平衡的数据结构,最后一个访问的键总是根。插入操作和二叉搜索树的插入类似,额外多了一些步骤来保证新插入的键称为新的根节点。

以下是插入键值k到一个Splay Tree的不同情况

  1. root是空:我们简单的分配一个新的节点,并将它作为root返回
  2. splay(伸展)给定的键值k。如果k已经存在,那么它称为新的根节点。如果不存在,那么最后访问的叶子节点称为新的根节点。
  3. 如果新的根节点和k相同,什么都不做因为k已经存在了。
  4. 否则,分配内存产生新的节点,并且将k和根的键值比较。
    1. 如果k比根的键值小,将root作为新节点的右孩子,复制root的左孩子作为新节点的左孩子,并且使root的左孩子置为NULL。
    2. 如果k比跟的键值大,将root作为新节点的左孩子,复制root的右孩子作为新节点的右孩子,并且使root的右孩子置为NULL。
  5. 将新节点返回,作为整棵树的根。

感觉Splay很大程度上是可以基于AVL树进行修改的,其中左旋、右旋、左右旋、右左旋操作是相同的,只是splay有splay操作。具体实现有时间会仔细看看,在下面参考的链接中有。

参考

https://www.geeksforgeeks.org/splay-tree-set-2-insert-delete/?ref=lbp