伸展樹 【資料結構與演算法分析 c 語言描述】

jerrkill發表於2019-01-14

1. 概述

知識點

  • 伸展樹的由來
  • 伸展樹的概念
  • 伸展樹的展開

2. 伸展樹的想法由來

  • 二叉搜尋樹的最壞情況是一個單連結串列,複雜度為 O(N)。如果發生最壞的情況很少很少,那麼我們的查詢速度仍然會很快。
  • 對一顆二叉搜尋樹進行查詢,事實證明最經常查的只是其中的一部分。

基於上面,伸展樹就孕育而生。
我的理解為,把經常查的關鍵字放到樹的上面,在這個過程中優化我們的樹結構;以達到控制我們所說的最壞情況很少很少。

當一個節點被訪問後,它就經過一些列的操作(展開)放到跟節點上。

3. 展開

展開在思想上類似於 AVL 樹的旋轉,設我們要訪問的節點為 X。有兩種情況:

  • X 的父節點為根。
  • X 有父親(P)和祖父(G)。

X 的父親為根節點:直接旋轉 X 跟 根節點。
X 有父親節點和祖父節點:這裡又分兩種情況,即是 AVL 樹四種情況合併成兩種的內部外部

  • 之字形 內部(左右、右左)。
  • 一字型 外部(右右、左左)。

3.1 之字形

看圖就明白。很簡單
file

3.2 一字形

看圖就明白,很簡單
file

4. 最後

伸展樹的節點是動態變化的,一顆最壞情況的二叉搜尋樹經過展開可以讓樹逐漸變得平衡。
file

高度自律,深度思考,以勤補拙

相關文章