紅黑樹的引入
一、有了二叉樹,爲什麼還需要平衡二叉樹?
二叉樹容易退化成一條鏈,也就是出現左斜樹、右斜樹的情況;
當出現斜樹的時候,查詢時間複雜度由O(log2N)增長至O(N);
引入左右子樹高度差絕對值不能大於1的平衡二叉樹,可以保證在最壞的情況下,查詢時間複雜度爲O(log2N);
平衡的定義,是說從空鏈接到根節點的距離相等,也就是說非葉子節點是不會出現空鏈接的;
二、有了平衡二叉樹,爲什麼還需要紅黑樹?
平衡二叉樹左右子樹的高度差絕對值不能大於1,每次進行插入刪除操作時,幾乎都需要通過旋轉來保持平衡;
頻繁地插入刪除操作,頻繁地旋轉,平衡二叉樹的性能大打折扣;
-
紅黑樹通過犧牲嚴格的平衡,換取插入、刪除時的旋轉操作,整體性能優於平衡二叉樹;
3.1 紅黑樹插入時的不平衡,通過不超過2次旋轉就能解決;
3.2 紅黑樹刪除時的不平衡,通過不超過3次旋轉就能解決;
紅黑樹的紅黑規則,保證在最壞的情況下,也能在O(log2N)時間內完成查找工作;
紅黑樹是什麼?有哪些特點和應用?
一、紅黑樹是一種自平衡的二叉查找樹。
紅黑樹
二、紅黑規則是什麼呢?
根節點是黑色;
節點不是黑色就是紅色;
葉子節點爲黑色,末梢的空節點nill,也就是null;
一個節點爲紅色,必須有兩個子節點爲黑色;
每個節點到葉子節點的所有路徑,都含有相同數量的黑色節點,也就是說有相同的黑色高度;
三、紅黑的優點有哪些?
紅黑規則4、5保證了紅黑樹的大致平衡;從根到葉子的所有路徑中,最長路徑不會超過最短路徑的2倍;
-
紅黑樹在最壞的情況下,依舊能滿足在O(log2N)時間內完成查找工作;
例:當黑色高度爲3時,最長路徑爲4:黑色-》紅色-》黑色-》紅色-》黑色;最短路徑爲2:黑色-》黑色-》黑色,不算葉子節點nil;
在Java實現中,NULL代表空節點;
新插入的節點爲紅色,因爲父節點爲黑色的概率最大;
四、紅黑樹的應用有哪些?
在java中,TreeMap、TreeSet都是用紅黑樹作爲底層數據結構;
JDK1.8以及後面的版本,HashMap也使用紅黑樹作爲底層數據結構;
多路複用技術的Epoll,其核心結構是紅黑樹 + 雙向鏈表;
Linux底層的CFS進程調度算法中,vruntime使用紅黑樹進行存儲。
參考文檔:
https://blog.csdn.net/u014454538/article/details/120120216