紅黑樹的介紹(一)

爲什麼要有紅黑樹?

BST(binary search tree)查詢的時間複雜度是logn\log n

但是,當它退化成鏈表的時候:

查詢時間複雜度就變成了O(n)O(n)

這是很糟糕的情況,雖然它還是符合二叉樹的定義(左小右大)。

所以,我們要限制一些規則,來讓樹保持平衡(儘可能的),以此保證查詢效率爲logn\log n

紅黑樹就是這麼一棵儘可能保持平衡的二叉搜索樹。

什麼是紅黑樹?

紅黑樹要滿足四個性質:

  1. 每個節點要麼是紅的,要麼是黑的
  2. 根節點和葉節點都是黑的
  3. 每個紅色節點的父節點是黑的。或者說,不可能出現連續的兩個紅色節點
  4. 對任意節點xx,它到葉子節點的簡單路徑所包含的黑色節點的數量是一樣的,我們稱之爲其黑高度是相等的。

前三點很好理解,第四點是什麼意思呢?

隨便找一個節點xx,找一條路徑到葉子節點,簡單路徑的意思就是你別回頭。

它的任意一條簡單路徑所包含的黑色節點是相同的。

比如上圖,黑色節點都是5個,我們說,其黑高度爲5。


舉一個紅黑樹的例子:

性質1,2,3都輕而易舉地滿足,我們看性質4。

首先是葉子節點,它們是空指針,它們的黑高度是0。

3,8,10,11,22,26的黑高度都是1。

7,18的黑高度是2。

因此性質四也滿足。


爲什麼查詢時間複雜度是logn\log n?

我們將證明h2log(n+1)h \le 2\log(n+1)

其中,hh是樹高,nn是key的數量,也就是節點的數量(不包含葉子的數量)。

我們的方法是:將紅色節點上移合併到黑色節點

在這裏插入圖片描述

合併後,這就變成了一棵2-3-4樹,因爲葉子有兩片的,有三片的,也有四片的。

我們數一下,合併前的紅黑樹,它的key的數量是8,葉子的數量是9。

一般來說,葉子節點的數量=key的數量+1=n+1

回到2-3-4樹。現在假定2-3-4樹的樹高爲hh'

因爲每個節點至少有兩個分支,至多有四個分支,所以:

h2(n+1)h4 h'^2\le(n+1)\le h'^4

我們關注左半部分。

hlog(n+1) h' \le \log(n+1)

那麼hhhh'有什麼關係呢?

由性質3可以得到,

h12hh' \ge \frac{1}{2} h

所以

h2log(n+1)h \le 2\log(n+1)

這就證明了查詢的時間複雜爲O(logn)O(\log n)

操作

紅黑樹的操作只要包括變色旋轉

比如要插入一個元素15,默認是紅色節點,就必然會違反紅黑樹的一些性質。只有通過變色和旋轉才能保證四條性質。

我們講一下旋轉。

旋轉有左旋和右旋。

右旋:

上圖的α,β,γ\alpha,\beta,\gamma都是subtree。

右旋其實很好理解,它必須要保證BST的性質,即

aα,bβ,cγaAbBc\forall a \in \alpha,b \in \beta, c \in \gamma \quad 有a\le A \le b \le B \le c

左旋反過來即可。

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