紅黑樹,不要把它想得太神祕了 紅黑樹的引入 紅黑樹是什麼?有哪些特點和應用?

紅黑樹的引入

一、有了二叉樹,爲什麼還需要平衡二叉樹?

  1. 二叉樹容易退化成一條鏈,也就是出現左斜樹、右斜樹的情況;

  2. 當出現斜樹的時候,查詢時間複雜度由O(log2N)增長至O(N);

  3. 引入左右子樹高度差絕對值不能大於1的平衡二叉樹,可以保證在最壞的情況下,查詢時間複雜度爲O(log2N);

  4. 平衡的定義,是說從空鏈接到根節點的距離相等,也就是說非葉子節點是不會出現空鏈接的;

二、有了平衡二叉樹,爲什麼還需要紅黑樹?

  1. 平衡二叉樹左右子樹的高度差絕對值不能大於1,每次進行插入刪除操作時,幾乎都需要通過旋轉來保持平衡;

  2. 頻繁地插入刪除操作,頻繁地旋轉,平衡二叉樹的性能大打折扣;

  3. 紅黑樹通過犧牲嚴格的平衡,換取插入、刪除時的旋轉操作,整體性能優於平衡二叉樹;

    3.1 紅黑樹插入時的不平衡,通過不超過2次旋轉就能解決;

    3.2 紅黑樹刪除時的不平衡,通過不超過3次旋轉就能解決;

  4. 紅黑樹的紅黑規則,保證在最壞的情況下,也能在O(log2N)時間內完成查找工作;

紅黑樹是什麼?有哪些特點和應用?

一、紅黑樹是一種自平衡的二叉查找樹。

紅黑樹

二、紅黑規則是什麼呢?

  1. 根節點是黑色;

  2. 節點不是黑色就是紅色;

  3. 葉子節點爲黑色,末梢的空節點nill,也就是null;

  4. 一個節點爲紅色,必須有兩個子節點爲黑色;

  5. 每個節點到葉子節點的所有路徑,都含有相同數量的黑色節點,也就是說有相同的黑色高度;

三、紅黑的優點有哪些?

  1. 紅黑規則4、5保證了紅黑樹的大致平衡;從根到葉子的所有路徑中,最長路徑不會超過最短路徑的2倍;

  2. 紅黑樹在最壞的情況下,依舊能滿足在O(log2N)時間內完成查找工作;

    例:當黑色高度爲3時,最長路徑爲4:黑色-》紅色-》黑色-》紅色-》黑色;最短路徑爲2:黑色-》黑色-》黑色,不算葉子節點nil;

  3. 在Java實現中,NULL代表空節點;

  4. 新插入的節點爲紅色,因爲父節點爲黑色的概率最大;

四、紅黑樹的應用有哪些?

  1. 在java中,TreeMap、TreeSet都是用紅黑樹作爲底層數據結構;

  2. JDK1.8以及後面的版本,HashMap也使用紅黑樹作爲底層數據結構;

  3. 多路複用技術的Epoll,其核心結構是紅黑樹 + 雙向鏈表;

  4. Linux底層的CFS進程調度算法中,vruntime使用紅黑樹進行存儲。

參考文檔:

https://blog.csdn.net/u014454538/article/details/120120216

https://www.zhihu.com/question/312327402

https://blog.csdn.net/cy973071263/article/details/122543826

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章