1. 程式人生 > >樹:AVL樹

樹:AVL樹

搜索樹 .com 最大 理論 深度 大量 統計 特點 tails

AVL樹得名於它的發明者。

AVL樹是帶有平衡條件的二叉查找樹。這個平衡條件必須要容易保持,而且它須保證樹的深度是O(logN)。

查找、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。

AVL樹本質上還是一棵二叉搜索樹(因此讀者可以看到我後面的代碼是繼承自二叉搜索樹的),它的特點是:

1. 本身首先是一棵二叉搜索樹。

2. 帶有平衡條件:每個結點的左右子樹的高度之差的絕對值(平衡因子)最多為1。

為什麽要有AVL樹呢?它有什麽作用呢?

如果在一大堆隨機數據中剛好有順序1,2,3,4,5這樣的數據,那麽這棵二叉搜索樹其實等同於一個鏈表了。也就是說,它在查找上的優勢已經全無了——在這種情況下,查找一個結點的時間復雜度是O(N)!

假如是AVL樹,AVL樹的查找平均時間復雜度就要比二叉搜索樹低了——它是O(logN)。也就是說,在大量的隨機數據中AVL樹的表現要好得多。

旋轉:

假設有一個結點的平衡因子為2(在AVL樹中,最大就是2,因為結點是一個一個地插入到樹中的,一旦出現不平衡的狀態就會立即進行調整,因此平衡因子最大不可能超過2),那麽就需要進行調整。由於任意一個結點最多只有兩個兒子,所以當高度不平衡時,只可能是以下四種情況造成的:

1. 對該結點的左兒子的左子樹進行了一次插入。

2. 對該結點的左兒子的右子樹進行了一次插入。

3. 對該結點的右兒子的左子樹進行了一次插入。

4. 對該結點的右兒子的右子樹進行了一次插入。

情況1和4是關於該點的鏡像對稱,同樣,情況2和3也是一對鏡像對稱。因此,理論上只有兩種情況,當然了,從編程的角度來看還是四種情況。

第一種情況是插入發生在“外邊”的情況(即左-左的情況或右-右的情況),該情況可以通過對樹的一次單旋轉來完成調整。第二種情況是插入發生在“內部”的情況(即左-右的情況或右-左的情況),該情況要通過稍微復雜些的雙旋轉來處理。

單旋轉:

情況1:對該結點的左兒子的左子樹進行了一次插入。

情況4:對該結點的右兒子的右子樹進行了一次插入。

雙旋轉:

情況2:對該結點的左兒子的右子樹進行了一次插入。

情況3:對該結點的右兒子的左子樹進行了一次插入。

紅黑樹和AVL樹的比較:

1.紅黑樹並不追求“完全平衡”——它只要求部分地達到平衡要求,降低了對旋轉的要求,從而提高了性能。

2.紅黑樹的算法時間復雜度和AVL相同,但統計性能比AVL樹更高.

應用:

AVL是一種高度平衡的二叉樹,所以通常的結果是,維護這種高度平衡所付出的代價比從中獲得的效率收益還大,故而實際的應用不多,更多的地方是用追求局部而不是非常嚴格整體平衡的紅黑樹。當然,如果場景中對插入刪除不頻繁,只是對查找特別有要求,AVL還是優於紅黑的。

參考:

http://blog.chinaunix.net/uid-25324849-id-2182877.html

http://www.tuicool.com/articles/FRRZnqB

樹:AVL樹

樹:AVL樹