一, 紅黑樹所處數據結構的位置:
在JDK源碼中, 有treeMap和JDK8的HashMap都用到了紅黑樹去存儲
紅黑樹可以看成B樹的一種:
從二叉樹看,紅黑樹是一顆相對平衡的二叉樹
二叉樹-->搜索二叉樹-->平衡搜索二叉樹--> 紅黑樹
從N階樹看,紅黑樹就是一顆 2-3-4樹
N階樹-->B(B-)樹
故我提取出了紅黑樹部分的源碼,去說明紅黑樹的理解
看之前,理解紅黑樹的幾個特性,后面的操作都是為了讓樹符合紅黑樹的這幾個特性,從而滿足對查找效率的O(logn)
二,紅黑樹特性,以及保持的手段
1,根和葉子節點都是黑色的
2,不能有有連續兩個紅色的節點
3, 從任一節點到它所能到達得葉子節點的所有簡單路徑都包含相同數目的黑色節點
這幾個特效,個人理解就是規定了紅黑樹是一顆2-3-4的B樹了,從而滿足了O(logn)查找效率
保持特性的手段,通過下面這些手段,讓紅黑樹滿足紅黑樹的特性,如果要嘗試理解,可以從2-3-4樹的向上增長,后面有詳細介紹
當然,這些改變也都是在O(logn)內完成的,主要改變方式有
1, 改變顏色
2, 左旋
3, 右旋
三,從JDK源碼來理解
主要看我的注釋,邏輯的理解
先看TreeMap
再看看HashMap的實現,
在HashMap中,在JDK8后開始用紅黑樹代替鏈表,查找由O(n) 變成了 O(Logn)
源碼分析如下:
紅黑樹的維護代碼部分如下:
情況圖如下
情況1
情況2
情況3
JDK源碼處理紅黑樹的流程圖
可見,其實處理邏輯實現都一樣的
三,個人對紅黑樹理解的方法
1, 如何理解紅黑樹的O(lgN)的特性?
從2-3-4樹去理解
紅黑樹,其實是一顆 2-3-4的B樹,B樹都是向上增長的,如果不理解向上增長可以先看看2-3樹,這樣理解就能知道為什么能O(logn)的查找了
2, 如何理解紅黑樹的紅黑節點意義?
可以把紅色節點看成是連接父節點的組成的一個大節點(2個或3個或4個節點組成的一個key),如下:
(此圖轉自網上)
紅色的就是和父節點組成了大節點,
比如
節點7和6,6是紅色節點組成,故和它父節點7組成了一個大節點,即 2-3-4樹的 6, 7節點
又如
節點 9和10和11,9和10為紅色節點,故和10組成了一個2-3-4的3階節點, 9,10,11(注意順序有的關性)
3 , B樹是如何保持O(lgn)的復雜度的呢?
B+樹都是從底布開始往上生長,自動平衡,如 2-3-4樹,當節點達到了3個時晉升到上個節點,所以不會產生單獨生長一邊的情況,形成平衡。
留個問題
4, 數據庫里的索引為什么不用紅黑樹而是用B+樹(Mysql)呢?
后續解答
歡迎關注我的公眾號,重現線上各種BUG, 一起來構建我們的知識體系