圖解 -- 樹的彙總

K戰神發表於2018-12-20

樹是一種很重要的資料結構,二叉樹 、 AVL樹 、紅黑樹 、 2-3樹 、B-Tree 、B+Tree

 

====    二叉 樹   ====

 

定義:

  • 若它的左子樹不為空,則左子樹上所有結點的值均小於等於根結點的值;
  • 若它的右子樹不為空,則右子樹上所有結點的值均大於等於根結點的值;
  • 它的左右子樹均為二分查詢樹。

 

 

選取一個節點為參照根節點,會發現所有的左側子節點小於等於參照點,右側大於等於參照點。

比如根節點9,  9所有的左側子節點(5、2、7、1、3)都小於等於9.

比如根節點13,13所有的左側子節點(11、10、12)都大於等於13.

 

1、查詢

查詢節點 10:根節點9開始,10>9 右側,10<13 左側,10<11 左側,找到10.

 

2、插入

插入 子節點 4:4<9 左側,4<5 左側,4>2 右側,4>3 右側

 

 

3、刪除

刪除節點(因為情況有多種,處理邏輯也是比較麻煩。)

A:刪除葉子:好吧就是一個乾巴巴的葉子,好辦,找到-刪除。

   刪除 7 ,這個7是葉子,那就找到並刪除

 

 

B:有一個分支的,刪除節點,子節點上提。

  刪除 2節點:找到2 ,刪除2

  再上提子節點 1

 

C:兩個分支,節點刪除,右子樹最小的數代替被刪除節點,

  因為右子樹最多有一個右葉子,重新指定引用。

    刪除 13,13有左右兩個分支:

 

   因為 右分支肯定大於左面分支,所以上提右子節點 15

 

 

====    AVL 樹   ====

自平衡二叉樹,任一節點對應的兩棵子樹的最大高度差為1。也可以稱之為 高度平衡樹。

插入、查詢、刪除平均最壞的時間複雜度為O( log n )。

每個節點都有一個平衡因子,即左右子樹的高度差 0 ,1,-1  這是滿足AVL樹的條件的;

也有可能是 -2 或者 2,高度差>1,所以需要自己再平衡,來滿足AVL樹的條件。

也就是隻要高度大於1我就會自己執行執行一下旋轉:

有這4種情況:左左 左右  右右  右左

左左:右旋轉(單旋轉)

 

左右:左旋轉+右旋轉(雙旋轉)

 

右右:左旋轉(單旋轉)

右左:左旋轉+右旋轉(雙旋轉),達到平衡

 

以上對應的是插入操作

 

查詢:同二叉樹

刪除:父節點的平衡因子依然維護在 0 ,1 ,-1 說明沒有打破平衡。平衡因子 2或者-2,我們依然使用旋轉來達到平衡。

 

     

 

相關文章