這裏再來複習一下二叉樹的概念:數組
理解了這些,咱們這節要學習的內容就是有關於二叉查找樹以及有關紅黑樹。數據結構
從這個名字,能夠簡單理解一下,他是爲了解決什麼被髮明出來的。固然是查找了。由於名字自帶查找。哈哈 開個玩笑。其實就是爲了方便查找學習
特徵:左邊子元素的值必定 <= 根節點
特徵:右邊子元素的值必定 >= 根節點code
這就是一個典型的二叉查找樹,好比咱們查找一個2
的元素位置blog
二叉查找樹使用二分法的思想,將元素的位置惟一指定出來。查找最大次數=二叉樹高度。get
這麼nice的二分法查找樹,也不是沒有缺陷的,世界上沒有任何一個完美的東西。
因此,它的缺陷就是:若是咱們的元素所有都是小於根節點的,那就變成這樣的一個東西了。class
這樣,如果查找一個關於7
的元素,那麼直接亂套了。直接和線性的數組就沒有區別了。仍是須要一個個遍歷。file
爲了解決這種缺陷,下面這個東西出現了!二叉樹
紅黑樹,是一種自我平衡的二叉查找樹,說白了就是比二叉查找樹更加Plus
HashMap 再JDK 8當中。若鏈表長度超過8,則轉換爲紅黑樹。這也是一種特別好用的數據結構。因此說。很重要
遍歷
黑色的空節點
在插入一個新值的時候,可能會使紅黑樹違反上面的5條規則,這個時候須要進行變色和旋轉,咱們逐一來說解。
假設向當前紅黑樹插入一個 21
節點。
21比22小,因此只能放到22左邊的位置。這裏問題也就來了:
紅色
的 而不能是黑色?葉子節點必須是黑色空節點,因此,紅色節點下必須有兩個黑色節點,因此該節點必須是紅色。
固然,又往上面看的話,你就會發現:22 是紅色節點,紅色節點必須包含兩個黑色節點? 這又衝突了。怎麼辦?
這裏嘗試將22 節點變爲黑色。這樣的話,下面的規則知足了。可是從17號元素出發。到葉子節點。左邊的線路有三個黑色節點,左邊只有兩個。
從任意節點到每一個葉子節點路徑都都包含相同數目的黑色節點
爲了規則的完整性,繼續變色。將25號元素變成紅色
這時候尚未結束,由於
每一個紅色節點下面都有兩個黑色節點
這樣纔算徹底符合規則規範。
這裏理解起來會很吃力。我先畫個圖。來理解這裏面涉及到的內容。
最簡單的方式是將子節點的左節點斷開,掛到父節點上,翻轉一下位置便可。
斷開子節點的左邊節點。
將斷開的這個節點掛到父節點上。
旋轉位置
很好理解吧!
斷開子節點的右孩子。
掛到父節點上
旋轉位置。
往那邊旋轉,就斷開本身的那邊的孩子,而後掛到父級,將節點變換一下位置便可。
其實紅黑樹的內容瞭解這麼多就能夠了。也不必必須鑽牛角尖。只須要懂得紅黑樹這種自平衡的主體思想便可。