一、基本概念
AVL樹既是平衡二叉樹。AVL樹的定義首先要求該樹是二叉查找樹(滿足排序規則),並在此基礎上增加了每個節點的平衡因子的定義,一個節點的平衡因子是該節點的左子樹樹高減去右子樹樹高的值。
===========================================================================
1. 二叉查找樹:又稱二叉排序樹/二叉搜索樹,具有以下性質:
(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
(4)沒有鍵值相等的節點。
2. 平衡因子BF:該節點的左子樹的深度減去它的右子樹深度。(平衡二叉樹上所有節點的平衡因子可能是-1,0和1)以圖示法講解吧——
(1)平衡二叉樹:此節點往下 左孩子 右孩子 結果
5的結點平衡因子就是 3 - 2 = 1;
2的結點平衡因子就是 1 - 2 = -1;
4的結點平衡因子就是 1 - 0 = 1;
6的結點平衡因子就是 0 - 1 = -1;
葉子結點都是為 0;
你在根據平衡二叉樹的新得推測 不平衡二叉樹的平衡因子;
(2)不平衡二叉樹:此節點往下 左孩子 右孩子 結果
3 的結點平衡因子就是 2 - 4 = -2;
1 的結點平衡因子就是 0 - 1 = -1;
4 的結點平衡因子就是 0 - 3 = -3;
5 的結點平衡因子就是 0 - 2 = -2;
6 的結點平衡因子就是 0 - 1 = -1;
葉子結點都是為 0;
===========================================================================
二、為什么要用AVL樹呢?
我們先來看看二叉搜索樹吧(因為AVL樹本質上是一棵二叉搜索樹),假設有這么一種極端的情況:二叉搜索樹的結點為1、2、3、4、5,也就是:
1
\
2
\
3
\
4
\
5
從這張圖里就能很清晰的看出來二叉搜索樹其實退化成了一個鏈表了,也就是說,它在查找上的優勢已經全無了。這種情況下,查找一個節點的時間復雜度是O(n)。
那如果是一個AVL樹呢?
2
/ \
1 4
/ \
3 5
可以看得出,AVL樹的查找平均復雜度是O(log(n))的,也就是說大量隨機數據中AVL樹表現的要好。(AVL樹查找時間復雜度就是樹高)
三、AVL樹旋轉
1. 造成AVL樹不平衡的原因可能有以下四點:
(1) 對該結點的左兒子的左子樹進行了一次插入。
(2) 對該結點的左兒子的右子樹進行了一次插入。
(3) 對該結點的右兒子的左子樹進行了一次插入。
(4) 對該結點的右兒子的右子樹進行了一次插入。
2. 旋轉
由於AVL樹需要做到平衡,所以每次插入葉子節點,如果發現不平衡,都需要進行旋轉以保持平衡。這里轉載了一個圖片,描述了AVL樹旋轉平衡的操作——
附錄:學習總結查詢鏈接
2.