red black tree
爲什麼要有紅黑樹?
BST(binary search tree)查詢的時間複雜度是。
但是,當它退化成鏈表的時候:
查詢時間複雜度就變成了。
這是很糟糕的情況,雖然它還是符合二叉樹的定義(左小右大)。
所以,我們要限制一些規則,來讓樹保持平衡(儘可能的),以此保證查詢效率爲。
紅黑樹就是這麼一棵儘可能保持平衡的二叉搜索樹。
什麼是紅黑樹?
紅黑樹要滿足四個性質:
- 每個節點要麼是紅的,要麼是黑的
- 根節點和葉節點都是黑的
- 每個紅色節點的父節點是黑的。或者說,不可能出現連續的兩個紅色節點
- 對任意節點,它到葉子節點的簡單路徑所包含的黑色節點的數量是一樣的,我們稱之爲其黑高度是相等的。
前三點很好理解,第四點是什麼意思呢?
隨便找一個節點,找一條路徑到葉子節點,簡單路徑的意思就是你別回頭。
它的任意一條簡單路徑所包含的黑色節點是相同的。
比如上圖,黑色節點都是5個,我們說,其黑高度爲5。
舉一個紅黑樹的例子:
性質1,2,3都輕而易舉地滿足,我們看性質4。
首先是葉子節點,它們是空指針,它們的黑高度是0。
3,8,10,11,22,26的黑高度都是1。
7,18的黑高度是2。
因此性質四也滿足。
爲什麼查詢時間複雜度是?
我們將證明
其中,是樹高,是key的數量,也就是節點的數量(不包含葉子的數量)。
我們的方法是:將紅色節點上移合併到黑色節點。
合併後,這就變成了一棵2-3-4樹,因爲葉子有兩片的,有三片的,也有四片的。
我們數一下,合併前的紅黑樹,它的key的數量是8,葉子的數量是9。
一般來說,葉子節點的數量=key的數量+1=n+1
回到2-3-4樹。現在假定2-3-4樹的樹高爲。
因爲每個節點至少有兩個分支,至多有四個分支,所以:
我們關注左半部分。
那麼與有什麼關係呢?
由性質3可以得到,
所以
這就證明了查詢的時間複雜爲。
操作
紅黑樹的操作只要包括變色和旋轉。
比如要插入一個元素15,默認是紅色節點,就必然會違反紅黑樹的一些性質。只有通過變色和旋轉才能保證四條性質。
我們講一下旋轉。
旋轉有左旋和右旋。
右旋:
上圖的都是subtree。
右旋其實很好理解,它必須要保證BST的性質,即
左旋反過來即可。