1. 程式人生 > >資料結構與算法系列18--紅黑樹

資料結構與算法系列18--紅黑樹

紅黑樹是平衡二叉查詢樹的一種,上一節我們已經講過二叉查詢樹的定義,那什麼是平衡二叉查詢樹呢?

什麼是平衡二叉查詢樹

定義:
平衡二叉查詢樹嚴格的定義是:二叉樹中任意一個節點的左右子樹的高度相差不能大於+1。從這個定義來看,的完全二叉樹、滿二叉樹其實都是平衡二叉樹,但是非完全二叉樹也有可能是平衡二叉樹。
目的:
發明平衡二叉查詢樹這類資料結構的初衷是,解決普通二叉查詢樹在頻繁的插入、刪除等動態更新的情況下,出現時間複雜度退化的問題。
所以,平衡二叉查詢樹中“平衡”的意思,其實就是讓整棵樹左右看起來比較“對稱”、比較“平衡”,不要出現左子樹很高、右子樹很矮的情況。這樣就能讓整棵樹的高度相對來說低一些,相應的插入、刪除、查詢等操作的效率高一些。

什麼是紅黑樹

平衡二叉查詢樹其實有很多,比如,Splay Tree(伸展樹)、Treap(樹堆)等,但是我們提到平衡二叉查詢樹,聽到的基本都是紅黑樹。
紅黑樹的英文是“Red-Black Tree”,簡稱 R-B Tree。它是一種不嚴格的平衡二叉查詢樹。它除了符合平衡二叉查詢樹的基本特性外,還具有如下特性:

  1. 節點是紅色或黑色;
  2. 根節點是黑色;
  3. 每個葉子節點都是黑色的空節點(NIL節點)。也就是說,葉子節點不儲存資料;根節點是黑色;
  4. 任何相鄰的節點都不能同時為紅色,也就是說,紅色節點是被黑色節點隔開的;
  5. 每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點;

正因為前面這些特性,紅黑樹從根節點到葉子的最長路徑不會超過最短路徑的2倍。
黑樹的插入、刪除、查詢各種操作效能都比較穩定。對於工程應用來說,要面對各種異常情況,為了支撐這種工業級的應用,我們更傾向於這種效能穩定的平衡二叉查詢樹。

運用場景

java中的TreeSet,TreeMap,廣泛用在C++的STL中。如map和set都是用紅黑樹實現的。

關於它的實現

這部分自己看的時候有點蒙,還是先跳過了,後續有時間再回過頭來看下。