AA 樹是一種用於高效存儲和檢索有序數據的平衡樹形結構,Arne Andersson 教授於 1993 年在他的論文 "Balanced search trees made simple" 中介紹,設計的目的是減少紅黑樹考慮的不同情況。AA 樹可以在 \(O(\log N)\) 的時間內做查找,插入和刪除。下面是一個 AA 樹的例子。
AA 樹是紅黑樹的一種變體,與紅黑樹不同,AA 樹上的紅色節點只能作為右子節點。這導致 AA 樹模擬了 2-3 樹而不是 2-3-4 樹,從而極大地簡化了維護操作。紅黑樹的維護算法需要考慮七種不同的情況來正確平衡樹。
因為紅色節點只能作為右子節點,AA 樹只需要考慮兩種情況。
定義
AA 樹遵循與紅黑樹相同的規則,但添加了一條新規則,即紅色節點不能作為左孩子出現。
每個節點都可以是紅色或黑色。
根節點總是黑色。
葉節點(NULL)總是黑色。
紅色節點的兩個子節點必須都是黑色,即沒有兩個相鄰的紅色節點。
從根節點到 NULL 節點的每條路徑都有相同數量的黑色節點。
紅色節點只能作為右子節點。
平衡維護
AA 樹的每個節點維護一個 level 字段,類似紅黑樹的每個節點維護一個 color 字段 ("RED" or "BLACK")。level 的規定滿足以下 5 個條件:
1、每個葉節點的 level 是 1。
2、每個左孩子的 level 是其父節點的 level 減 1。
3、每個右孩子的 level 等於其父節點的 level 或等於其父節點的 level 減 1。
4、每個右孫子的 level 嚴格小於其祖父節點的 level。
5、每個 level 大於 1 的節點有兩個孩子。
水平鏈接(Horizontal Link)
子節點的 level 等於父節點的 level 的鏈接被稱為 水平鏈接,類似於紅黑樹中的紅鏈接。允許單獨的右水平鏈接,但不允許連續的右水平鏈接;不允許左水平鏈接。這些限制比紅黑樹的限制更加嚴格,因此 AA 樹的平衡過程比紅黑樹的平衡過程在程序上要簡單得多。
插入和刪除操作可能會暫時導致 AA 樹失去平衡(即違反 AA 樹的不變性)。恢復平衡只需要兩種不同的操作:"skew"(斜化)和"split"(分裂)。"Skew"是將一個包含左水平鏈接的子樹進行右旋轉,以替換為一個包含右水平鏈接的子樹。"Split"是進行左旋轉並增加 level,以替換一個包含兩個或更多連續的右水平鏈接的子樹,使其變為一個包含兩個較少連續的右水平鏈接的子樹。保持平衡的插入和刪除的實現通過依賴"skew"和"split"操作來僅在需要時修改樹,而不是由調用者決定是否進行"skew"或"split",從而變得更加簡化。
split(左旋)
出現連續向右的水平方向鏈(連續三個向右的孩子屬於同一 level,節點 R 和節點 X 都是紅色節點)。