數據結構 3 二叉查找樹、紅黑樹、旋轉與變色 理解與使用

這裏再來複習一下二叉樹的概念:數組

  1. 每一個節點下子元素不可超過兩個,必須是0個或者一個或則兩個
  2. 二叉樹是一種有序樹。

理解了這些,咱們這節要學習的內容就是有關於二叉查找樹以及有關紅黑樹。數據結構

二叉查找樹

從這個名字,能夠簡單理解一下,他是爲了解決什麼被髮明出來的。固然是查找了。由於名字自帶查找。哈哈 開個玩笑。其實就是爲了方便查找學習

特徵:左邊子元素的值必定 <= 根節點
特徵:右邊子元素的值必定 >= 根節點code

這就是一個典型的二叉查找樹,好比咱們查找一個2的元素位置blog

  • 從根節點出發。5比2大,向着左節點4
  • 4比2大,向着左節點
  • 到達2的位置。

二叉查找樹使用二分法的思想,將元素的位置惟一指定出來。查找最大次數=二叉樹高度。get

二叉查找樹缺陷

這麼nice的二分法查找樹,也不是沒有缺陷的,世界上沒有任何一個完美的東西。
因此,它的缺陷就是:若是咱們的元素所有都是小於根節點的,那就變成這樣的一個東西了。class

這樣,如果查找一個關於7 的元素,那麼直接亂套了。直接和線性的數組就沒有區別了。仍是須要一個個遍歷。file

爲了解決這種缺陷,下面這個東西出現了!二叉樹

紅黑樹

紅黑樹,是一種自我平衡的二叉查找樹,說白了就是比二叉查找樹更加Plus
HashMap 再JDK 8當中。若鏈表長度超過8,則轉換爲紅黑樹。這也是一種特別好用的數據結構。因此說。很重要遍歷

特色

  1. 節點要麼是紅色/黑色(名字中自帶的屬性)
  2. 根節點是黑色的。
  3. 葉子節點是黑色的空節點
  4. 每一個紅色節點下面都有兩個黑色節點
  5. 從任意節點到每一個葉子節點路徑都都包含相同數目的黑色節點

插入一個新值

在插入一個新值的時候,可能會使紅黑樹違反上面的5條規則,這個時候須要進行變色和旋轉,咱們逐一來說解。

假設向當前紅黑樹插入一個 21 節點。

21比22小,因此只能放到22左邊的位置。這裏問題也就來了:

  • 爲啥這個節點必須是紅色的 而不能是黑色?

葉子節點必須是黑色空節點,因此,紅色節點下必須有兩個黑色節點,因此該節點必須是紅色。

固然,又往上面看的話,你就會發現:22 是紅色節點,紅色節點必須包含兩個黑色節點? 這又衝突了。怎麼辦?

節點的變色

這裏嘗試將22 節點變爲黑色。這樣的話,下面的規則知足了。可是從17號元素出發。到葉子節點。左邊的線路有三個黑色節點,左邊只有兩個。

從任意節點到每一個葉子節點路徑都都包含相同數目的黑色節點

爲了規則的完整性,繼續變色。將25號元素變成紅色

這時候尚未結束,由於

每一個紅色節點下面都有兩個黑色節點

這樣纔算徹底符合規則規範。

節點的旋轉方法

左旋轉

這裏理解起來會很吃力。我先畫個圖。來理解這裏面涉及到的內容。

  1. 父節點被本身的右邊孩子取代。
  2. 而原來的父節點則須要成爲被取代位置的左節點。

最簡單的方式是將子節點的左節點斷開,掛到父節點上,翻轉一下位置便可。

  1. 斷開子節點的左邊節點。

  2. 將斷開的這個節點掛到父節點上。

  3. 旋轉位置

很好理解吧!

右旋轉 順時針旋轉

  1. 斷開子節點的右孩子。

  2. 掛到父節點上

  3. 旋轉位置。

往那邊旋轉,就斷開本身的那邊的孩子,而後掛到父級,將節點變換一下位置便可。

小結

其實紅黑樹的內容瞭解這麼多就能夠了。也不必必須鑽牛角尖。只須要懂得紅黑樹這種自平衡的主體思想便可。

參考

https://mp.weixin.qq.com/s/jz1ajDUygZ7sXLQFHyfjWA

相關文章
相關標籤/搜索