前面所講的二叉搜索樹有個比較嚴重致命的問題就是極端狀況下當數據以排序好的順序建立搜索樹此時二叉搜索樹將退化爲鏈表結構所以性能也大幅度降低,所以爲了解決此問題咱們下面要介紹的與二叉搜索樹很是相似的結構就誕生了;性能
AVL(Adelson-Velskii and Landis)樹,名字取自其發明者 G.M. Adelson-Velsky 和 E.M. Landis的首字母,AVL樹是一棵特殊的二叉搜索樹它與普通二叉搜索樹最主要的區別就是其可以使二叉搜索樹維持其左右節點的平衡;
AVL樹:其任意一個節點左子樹與右子樹高度差不超過1,因爲此特徵所以須要在AVL增刪節點時維護其左右節點使該樹知足該特性(左右節點平衡);code
此AVL樹中節點2節點高度都爲2,節點1與3節點高度都爲1;節點高度爲左右子樹中最大的節點高度+1;對象
AVL樹實現關鍵blog
一、標註其節點高度
二、計算節點平衡因子
三、維護其節點知足左右節點高度不超過1排序
一、AVL樹定義
根據AVL樹的特性先定義該數據類型的結構;遞歸
type AVL struct { root *AVLNode size int compare Comparable } type AVLNode struct { e interface{} left *AVLNode right *AVLNode height int }
AVL:爲定義的AVL樹自定義對象
AVLNode:爲樹中每一個節點的節點自定義對象
compare:爲定義的用於樹中節點元素進行數據對比的對象
size:AVL樹的元素個數
root:樹的根節點
e:節點元素值
left:左子樹
right:右子樹
height:節點高度get
AVL樹與二叉搜索樹同樣全部不少操做均可用遞歸來實現,好比元素的添加、刪除、查找等;
能夠說AVL樹爲二叉搜索樹的升級版本因此並不會像出現二叉搜索樹同樣出現退化爲O(n)時間複雜度的狀況,與二叉搜索樹同樣經過中序遍歷可獲得排序好的數據,二叉搜索樹的搜索、插入、刪除時間複雜度爲O(log(n)),n爲樹的深度,這裏只是簡單的介紹了AVL樹,後面會有AVL樹實現的相關介紹;it
文章首發地址:Solinx
http://www.solinx.co/archives/1323class