面试让你手撕红黑树?30张图带你彻底理解红黑树~
看完本篇文章希望你能解決以下問題,文章稍長,希望你耐心看完!
- 紅黑樹也有自旋操作,為什么會比AVL要性能好呢(或者說穩定呢)?
- 紅黑樹的平衡調整策略?
- 看完能不能手撕紅黑樹?
1.先來復習復習AVL樹
平衡二叉樹有很多,最先被發明的平衡二叉樹是AVL,是一種高度平衡的二叉查找樹;為什么會引入AVL呢?它有什么特別之處呢?
普通的二叉搜索樹的時間復雜度在O(logn) ~ O(n),在頻繁進行插入、刪除可能會出現復雜度退化的情形;也就是在極端情況下,二叉樹搜索樹退化成了鏈表
普通的二叉搜索的兩種極端情況如下圖:
如果是你,你認為應該怎么解決如上問題呢?
其實最核心的一點就是“平衡”,也就是希望節點兩邊盡可能地保持一致,這樣就能保證我們地時間復雜度處于O(logn),因此AVL樹幫我們解決了這一個問題。
在AVL樹中,任意一個節點的左右子樹的高度差的絕對值不會大于1,這是AVL樹達到平衡核心性質;雖然AVL樹解決了一邊倒的情形,但是AVL平衡調整時的左旋和右旋也消耗了一定的性能,所以AVL樹應用也不是很廣泛。
- 有關AVL樹我就不再過多敘述,本章的重點是紅黑樹。
2.探討紅黑樹的魅力
在源碼學習過程中,更是到處都是紅黑樹的影子!!!
紅黑樹相對于普通的二叉搜索樹稍微難了點,那它難在哪呢?主要是在插入和刪除時可能會破壞樹的平衡性,所以需要進行自適應調整重新達到平衡狀態。其實耐下心來看完,發現紅黑樹也就是那么回事。紅黑樹是必須要掌握的點,往遠了說紅黑樹使用非常廣泛,往近了說很多map類的源碼中都用到了紅黑樹。
先來看紅黑樹的性質(本質上和2-3樹具有等價性想了解的同學可以取看看,對了解B樹也有幫助)。
- 1.根節點必須是黑色
- 2.節點非黑即紅
- 3.葉子節點是黑色(這個是虛擬節點nil,實際上不存在,就是那個最后一個節點的left和right指向的空)
- 4.兩個紅色節點不能相連
- 5.根節點到葉子節點,黑色節點數目相同
通過以上的性質你能看出來什么特點沒?
- (1)注定了紅黑樹中最長路徑是最短路徑的兩倍
- (2)紅黑樹通過樹高來控制平衡,也就是(1)所講的
回到剛開始開頭問的問題,為什么紅黑樹要比AVL更加廣泛具有代表性?
紅黑樹比AVL樹的平衡控制條件更加松散;AVL要求左右樹差的絕對值必須小于1,這就導致了AVL樹在插入和刪除之后發生調整的概率要比紅黑樹要大,而自旋操作又是比較浪費性能的,所以也就導致了控制條件較為松散的紅黑樹比較吃香。
有的人會問了那控制條件能不能更松散些呢?
需要考慮查詢效率和消耗的性能,再松散直接使用鏈表得嘞。
飛速手撕紅黑樹中…
總結
以上是生活随笔為你收集整理的面试让你手撕红黑树?30张图带你彻底理解红黑树~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Jenkins持续集成】docker部
- 下一篇: you aren‘t using a c