1. 概述
知識點
- 伸展樹的由來
- 伸展樹的概念
- 伸展樹的展開
2. 伸展樹的想法由來
- 二叉搜尋樹的最壞情況是一個單連結串列,複雜度為 O(N)。如果發生最壞的情況很少很少,那麼我們的查詢速度仍然會很快。
- 對一顆二叉搜尋樹進行查詢,事實證明最經常查的只是其中的一部分。
基於上面,伸展樹就孕育而生。
我的理解為,把經常查的關鍵字放到樹的上面,在這個過程中優化我們的樹結構;以達到控制我們所說的最壞情況很少很少。
當一個節點被訪問後,它就經過一些列的操作(展開)放到跟節點上。
3. 展開
展開在思想上類似於 AVL 樹的旋轉,設我們要訪問的節點為 X。有兩種情況:
- X 的父節點為根。
- X 有父親(P)和祖父(G)。
X 的父親為根節點:直接旋轉 X 跟 根節點。
X 有父親節點和祖父節點:這裡又分兩種情況,即是 AVL 樹四種情況合併成兩種的內部跟外部
- 之字形 內部(左右、右左)。
- 一字型 外部(右右、左左)。
3.1 之字形
看圖就明白。很簡單
3.2 一字形
看圖就明白,很簡單
4. 最後
伸展樹的節點是動態變化的,一顆最壞情況的二叉搜尋樹經過展開可以讓樹逐漸變得平衡。