008-數據結構-樹形結構-二叉查找樹-伸展樹
阿新 • • 發佈:2019-05-16
輸入法 代碼 應用 strong tree 概述 width 需要 struct (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比樹中任何鍵值都大,那麽此時,將最大節點旋轉為根節點。
一、概述
伸展樹(Splay Tree)是特殊的二叉查找樹。
它的特殊是指,它除了本身是棵二叉查找樹之外,它還具備一個特點: 當某個節點被訪問時,伸展樹會通過旋轉使該節點成為樹根。這樣做的好處是,下次要訪問該節點時,能夠迅速的訪問到該節點。
AVL樹為了保持嚴格的平衡,所以在數據插入上會呈現過多的旋轉,影響了插入和刪除的性能。從訪問量上,我們知道許多應用場景都有一個“二八原則“,也就是說80%的人只會用到20%的數據,比如說我們的用的輸入法,平常打的字也就那麽多,或許還沒有20%呢。
二、詳細說明
旋轉是伸展樹中需要重點關註的
將"鍵值為key的節點"旋轉為根節點,並返回根節點。它的處理情況共包括:
將"鍵值為key的節點"旋轉為根節點。
(b):伸展樹中不存在"鍵值為key的節點",並且key < tree->key。
b-1) "鍵值為key的節點"的前驅節點存在的話,將"鍵值為key的節點"的前驅節點旋轉為根節點。
b-2) "鍵值為key的節點"的前驅節點存在的話,則意味著,key比樹中任何鍵值都小,那麽此時,將最小節點旋轉為根節點。
(c):伸展樹中不存在"鍵值為key的節點",並且key > tree->key。
c-1) "鍵值為key的節點"的後繼節點存在的話,將"鍵值為key的節點"的後繼節點旋轉為根節點。
2.1、說明
在下面的伸展樹中查找10,,共包括"右旋" --> "右鏈接" --> "組合"這3步。
01, 右旋
對應代碼中的"rotate right"部分
02, 右鏈接
對應代碼中的"link right"部分
03. 組合
對應代碼中的"assemble"部分
代碼地址:地址 中的data-004-tree中 SplayTree
2.2、示例
008-數據結構-樹形結構-二叉查找樹-伸展樹