紅黑樹

balfish發表於2024-03-05

紅黑樹是一種自平衡二叉查詢樹,透過在插入和刪除節點時進行顏色變換和旋轉操作,使得樹始終保持平衡狀態,它具有以下特點:

  1. 每個節點非紅即黑;
  2. 根節點總是黑色的;
  3. 每個葉子節點都是黑色的空節點(NIL 節點);
  4. 如果節點是紅色的,則它的子節點必須是黑色的(反之不一定);
  5. 從根節點到葉節點或空子節點的每條路徑,必須包含相同數目的黑色節點(即相同的黑色高度)。

和 AVL 樹不同的是,紅黑樹並不追求嚴格的平衡,而是大致的平衡。正因如此,紅黑樹的查詢效率稍有下降,因為紅黑樹的平衡性相對較弱,可能會導致樹的高度較高,這可能會導致一些資料需要進行多次磁碟 IO 操作才能查詢到,這也是 MySQL 沒有選擇紅黑樹的主要原因。也正因如此,紅黑樹的插入和刪除操作效率大大提高了,因為紅黑樹在插入和刪除節點時只需進行 O(1) 次數的旋轉和變色操作,即可保持基本平衡狀態,而不需要像 AVL 樹一樣進行 O(logn) 次數的旋轉操作。

紅黑樹的應用還是比較廣泛的,TreeMap、TreeSet 以及 JDK1.8 的 HashMap 底層都用到了紅黑樹。對於資料在記憶體中的這種情況來說,紅黑樹的表現是非常優異的。

相關文章