AVL 樹是計算機科學中最早被髮明的自平衡二叉查詢樹。在 AVL 樹中，任一節點對應的兩棵子樹的最大高度差為 1，因此它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下的時間複雜度都是 O log n。增加和刪除元素的操作則可能需要藉由一次或多次樹旋轉，以實現樹的重新平衡。AVL 樹得名於它的發明者格奧爾吉阿杰爾松 韋利斯基和葉夫根尼蘭迪斯，他們在 1962 年的論文《An algorithm for the organization of information》中公開了這一資料結構。 節點的平衡因子是它的左子樹的高度減去它的右子樹的高度（有時相反）。帶有平衡因子 1、0 或 1 的節點被認為是平衡的。帶有平衡因子 2 或 2 的節點被認為是不平衡的，並需要重新平衡這個樹。平衡因子可以直接儲存在每個節點中，或從可能儲存在節點中的子樹高度計算出來。 操作 AVL 樹的基本操作一般涉及運作同在不平衡的二叉查詢樹所運作的同樣的演算法。但是要進行預先或隨後做一次或多次所謂的 AVL 旋轉。 以下圖表以四列表示四種情況，每行表示在該種情況下要進行的操作。在左左和右右的情況下，只需要進行一次旋轉操作；在左右和右左的情況下，需要進行兩次旋轉操作。 刪除 從 AVL 樹中刪除，可以透過把要刪除的節點向下旋轉成一個葉子節點，接著直接移除這個葉子節點來完成。因為在旋轉成葉子節點期間最多有 log n 個節點被旋轉，而每次 AVL 旋轉耗費固定的時間，所以刪除處理在整體上耗費 O log n 時間。 搜尋 可以像普通二叉查詢樹一樣的進行，所以耗費 O log n 時間，因為 AVL 樹總是保持平衡的。不需要特殊的準備，樹的結構不會由於查詢而改變。（這是與伸展樹搜尋相對立的，它會因為搜尋而變更樹結構。） 實現描述 假設平衡因子是左子樹的高度減去右子樹的高度所得到的值，又假設由於在二叉排序樹上插入節點而失去平衡的最小子樹根節點的指標為 a（即 a 是離插入點最近，且平衡因子絕對值超過 1 的祖先節點），則失去平衡後進行的規律可歸納為下列四種情況： 單向右旋平衡處理 LL：由於在 a 的左子樹根節點的左子樹上插入節點，a 的平衡因子由 1 增至 2，致使以 a 為根的子樹失去平衡，則需進行一次右旋轉操作； 單向左旋平衡處理 RR：由於在 a 的右子樹根節點的右子樹上插入節點，a 的平衡因子由 1 變為 2，致使以 a 為根的子樹失去平衡，則需進行一次左旋轉操作； 雙向旋轉（先左後右）平衡處理 LR：由於在 a 的左子樹根節點的右子樹上插入節點，a 的平衡因子由 1 增至 2，致使以 a 為根的子樹失去平衡，則需進行兩次旋轉（先左旋後右旋）操作。 雙向旋轉（先右後左）平衡處理 RL：由於在 a 的右子樹根節點的左子樹上插入節點，a 的平衡因子由 1 變為 2，致使以 a 為根的子樹失去平衡，則需進行兩次旋轉（先右旋後左旋）操作。 在平衡的二叉排序樹 BBST Balancing Binary Search Tree 上插入一個新的資料元素 e 的遞迴演算法可描述如下： 若 BBST 為空樹，則插入一個數據元素為 e 的新節點作為 BBST 的根節點，樹的深度增 1； 若 e 的關鍵字和 BBST 的根節點的關鍵字相等，則不進行； 若 e 的關鍵字小於 BBST 的根節點的關鍵字，而且在 BBST 的左子樹中不存在和 e 有相同關鍵字的節點，則將 e 插入在 BBST 的左子樹上，並且當插入之後的左子樹深度增加（1）時，分別就下列不同情況處理之： BBST 的根節點的平衡因子為 1（右子樹的深度大於左子樹的深度）：則將根節點的平衡因子更改為 0，BBST 的深度不變； BBST 的根節點的平衡因子為 0（左、右子樹的深度相等）：則將根節點的平衡因子更改為 1，BBST 的深度增 1； BBST 的根節點的平衡因子為 1（左子樹的深度大於右子樹的深度）：則若 BBST 的左子樹根節點的平衡因子為 1：則需進行單向右旋平衡處理，並且在右旋處理之後，將根節點和其右子樹根節點的平衡因子更改為 0，樹的深度不變； 若 e 的關鍵字大於 BBST 的根節點的關鍵字，而且在 BBST 的右子樹中不存在和 e 有相同關鍵字的節點，則將 e 插入在 BBST 的右子樹上，並且當插入之後的右子樹深度增加（1）時，分別就不同情況處理之。 AVL 樹的調平（Erlang 的實現） balance null null balance null _ nullTree Tree balance Left Value RightTree Diff count Leftcount Right if Diff 2 and Diff 2 balance Left Value balance Right Diff 1 balance rotate_right Tree Diff 1 balance rotate_left Tree true exit This is impossible end rotate_right Left Value Right merge_max Left null Value Right rotate_left Left Value Right merge_min Right Left Value null merge_min null Value Right Tree2 Tree2 Value Right merge_min Left _ _ Tree2 merge_min Left Tree2 merge_max Left Value null Tree2 Left Value Tree2 merge_max _ _ Right Tree2 merge_max Right Tree2 AVL 節點數計算 高度為 h 的 AVL 樹，總節點數 N 最多 2h1 1； 最少節點數 N_h 如以斐波那契數列可以用數學歸納法證明： N_h F_h2 1 F_h2 是斐波那契數列的第 h2 項，根據斐波那契多項式得來。 即 N_0 0 表示 AVL Tree 高度為 0 的節點總數 N_1 1 表示 AVL Tree 高度為 1 的節點總數 N_2 2 表示 AVL Tree 高度為 2 的節點總數 N_h N_h1 N_h2 1 表示 AVL Tree 高度為 h 的節點總數 換句話說，當節點數為 N 時，高度 h 最多為 log_Phi sqrt 5 N1 2 。 參見 樹旋轉 伸展樹 紅黑樹 B 樹 引用 G AdelsonVelskii and EM Landis An algorithm for the organization of information Doklady Akademii Nauk SSSR 146263266 1962（Russian） English translation by Myron J Ricci in Soviet Math Doklady 312591263 1962 外部連結 Description from the Dictionary of Algorithms and Data Structures AVL Tree Traversal Linked AVL tree C AVL Tree Template and C AVL TREE Generic Package by Walt Karas A Visual Basic AVL Tree Container Class by Jim Harris AVL Trees Tutorial and C Implementation by Brad Appleton Ulms Oberon Library AVLTrees The AVL TREE Data Type CNAVLTree Class Reference GNU libavl AVLtrees balanced binary trees by Alex Konshin Simulation of AVL Trees AVL tree applet Simulation of AVL Trees DYNAMIC AVL Splay and RedBlack Applet Data Structures and Algorithm Analysis in C 2nd edition Category 資料結構 Category 樹結構 Category 二叉樹 Category 搜尋樹 Category 帶有虛擬碼示例的條目