樹是一種很重要的數據結構,二叉樹 、 AVL樹 、紅黑樹 、 2-3樹 、B-Tree 、B+Tree數據結構
==== 二叉 樹 ====spa
定義:3d
選取一個節點爲參照根節點,會發現全部的左側子節點小於等於參照點,右側大於等於參照點。blog
好比根節點9, 9全部的左側子節點(五、二、七、一、3)都小於等於9.二叉樹
好比根節點13,13全部的左側子節點(十一、十、12)都大於等於13.引用
一、查找im
查找節點 10:根節點9開始,10>9 右側,10<13 左側,10<11 左側,找到10.d3
二、插入數據
插入 子節點 4:4<9 左側,4<5 左側,4>2 右側,4>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,咱們依然使用旋轉來達到平衡。