1. 程式人生 > >008-數據結構-樹形結構-二叉查找樹-伸展樹

008-數據結構-樹形結構-二叉查找樹-伸展樹

輸入法 代碼 應用 strong tree 概述 width 需要 struct

一、概述

  伸展樹(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、示例

  技術分享圖片

008-數據結構-樹形結構-二叉查找樹-伸展樹