什麼是紅黑樹?程式設計師面試必問!

2021-02-19 java小組

點擊上方java小組,選擇「置頂公眾號」

優質文章,第一時間送達

當在10億數據中只需要進行10幾次比較就能查找到目標時,不禁感嘆編程之魅力!人類之偉大呀! —— 學紅黑樹有感。

終於,在學習了幾天的紅黑樹相關的知識後,我想把我所學所想和所感分享給大家。紅黑樹是一種比較難的數據結構,要完全搞懂非常耗時耗力,紅黑樹怎麼自平衡?什麼時候需要左旋或右旋?插入和刪除破壞了樹的平衡後怎麼處理?等等一連串的問題在學習前困擾著我。如果你在學習過程中也會存在我的疑問,那麼本文對你會有幫助,本文幫助你全面、徹底地理解紅黑樹,面試官放馬過來!

本文將通過圖文的方式講解紅黑樹的知識點,並且不會涉及到任何代碼,相信我,在懂得紅黑樹實現原理前,看代碼會一頭霧水的,當原理懂了,代碼也就按部就班寫而已,沒任何難度。

閱讀本文你需具備知識點:

關於紅黑樹的知識面試經常問,本文作者是安卓大叔,歡迎點擊閱讀原文關注作者的簡書。事不宜遲,讓我們進入正題吧。

正文

紅黑樹也是二叉查找樹,我們知道,二叉查找樹這一數據結構並不難,而紅黑樹之所以難是難在它是自平衡的二叉查找樹,在進行插入和刪除等可能會破壞樹的平衡的操作時,需要重新自處理達到平衡狀態。現在在腦海想下怎麼實現?是不是太多情景需要考慮了?嘖嘖,先別急,通過本文的學習後,你會覺得,其實也不過如此而已。好吧,我們先來看下紅黑樹的定義和一些基本性質。

紅黑樹定義和性質

紅黑樹是一種含有紅黑結點並能自平衡的二叉查找樹。它必須滿足下面性質:

從性質5又可以推出:

圖1就是一顆簡單的紅黑樹。其中Nil為葉子結點,並且它是黑色的。(值得提醒注意的是,在Java中,葉子結點是為null的結點。)

圖1 一顆簡單的紅黑樹

紅黑樹並不是一個完美平衡二叉查找樹,從圖1可以看到,根結點P的左子樹顯然比右子樹高,但左子樹和右子樹的黑結點的層數是相等的,也即任意一個結點到到每個葉子結點的路徑都包含數量相同的黑結點(性質5)。所以我們叫紅黑樹這種平衡為黑色完美平衡

介紹到此,為了後面講解不至於混淆,我們還需要來約定下紅黑樹一些結點的叫法,如圖2所示。

圖2 結點叫法約定

我們把正在處理(遍歷)的結點叫做當前結點,如圖2中的D,它的父親叫做父結點,它的父親的另外一個子結點叫做兄弟結點,父親的父親叫做祖父結點。

前面講到紅黑樹能自平衡,它靠的是什麼?三種操作:左旋、右旋和變色。

圖3 左旋

圖4 右旋

上面所說的旋轉結點也即旋轉的支點,圖4和圖5中的P結點。
我們先忽略顏色,可以看到旋轉操作不會影響旋轉結點的父結點,父結點以上的結構還是保持不變的。
左旋只影響旋轉結點和其右子樹的結構,把右子樹的結點往左子樹挪了。
右旋只影響旋轉結點和其左子樹的結構,把左子樹的結點往右子樹挪了。

所以旋轉操作是局部的。另外可以看出旋轉能保持紅黑樹平衡的一些端詳了:當一邊子樹的結點少了,那麼向另外一邊子樹「借」一些結點;當一邊子樹的結點多了,那麼向另外一邊子樹「租」一些結點。

但要保持紅黑樹的性質,結點不能亂挪,還得靠變色了。怎麼變?具體情景又不同變法,後面會具體講到,現在只需要記住紅黑樹總是通過旋轉和變色達到自平衡

balabala了這麼多,相信你對紅黑樹有一定印象了,那麼現在來考考你:

思考題1:黑結點可以同時包含一個紅子結點和一個黑子結點嗎? (答案見文末)

接下來先講解紅黑樹的查找熱熱身。

紅黑樹查找

因為紅黑樹是一顆二叉平衡樹,並且查找不會破壞樹的平衡,所以查找跟二叉平衡樹的查找無異:

從根結點開始查找,把根結點設置為當前結點;

若當前結點為空,返回null;

若當前結點不為空,用當前結點的key跟查找key作比較;

若當前結點key等於查找key,那麼該key就是查找目標,返回當前結點;

若當前結點key大於查找key,把當前結點的左子結點設置為當前結點,重複步驟2;

若當前結點key小於查找key,把當前結點的右子結點設置為當前結點,重複步驟2;

如圖5所示。

圖5 二叉樹查找流程圖

非常簡單,但簡單不代表它效率不好。正由於紅黑樹總保持黑色完美平衡,所以它的查找最壞時間複雜度為O(2lgN),也即整顆樹剛好紅黑相隔的時候。能有這麼好的查找效率得益於紅黑樹自平衡的特性,而這背後的付出,紅黑樹的插入操作功不可沒~

紅黑樹插入

插入操作包括兩部分工作:一查找插入的位置;二插入後自平衡。查找插入的父結點很簡單,跟查找操作區別不大:

從根結點開始查找;

若根結點為空,那麼插入結點作為根結點,結束。

若根結點不為空,那麼把根結點作為當前結點;

若當前結點為null,返回當前結點的父結點,結束。

若當前結點key等於查找key,那麼該key所在結點就是插入結點,更新結點的值,結束。

若當前結點key大於查找key,把當前結點的左子結點設置為當前結點,重複步驟4;

若當前結點key小於查找key,把當前結點的右子結點設置為當前結點,重複步驟4;

如圖6所示。

圖6 紅黑樹插入位置查找

ok,插入位置已經找到,把插入結點放到正確的位置就可以啦,但插入結點是應該是什麼顏色呢?答案是紅色。理由很簡單,紅色在父結點(如果存在)為黑色結點時,紅黑樹的黑色平衡沒被破壞,不需要做自平衡操作。但如果插入結點是黑色,那麼插入位置所在的子樹黑色結點總是多1,必須做自平衡。

所有插入情景如圖7所示。

圖7 紅黑樹插入情景

嗯,插入情景很多呢,8種插入情景!但情景1、2和3的處理很簡單,而情景4.2和情景4.3隻是方向反轉而已,懂得了一種情景就能推出另外一種情景,所以總體來看,並不複雜,後續我們將一個一個情景來看,把它徹底搞懂。

另外,根據二叉樹的性質,除了情景2,所有插入操作都是在葉子結點進行的。這點應該不難理解,因為查找插入位置時,我們就是在找子結點為空的父結點的。

在開始每個情景的講解前,我們還是先來約定下,如圖8所示。

圖8 插入操作結點的叫法約定

圖8的字母並不代表結點Key的大小。I表示插入結點,P表示插入結點的父結點,S表示插入結點的叔叔結點,PP表示插入結點的祖父結點。

好了,下面讓我們一個一個來分析每個插入的情景以其處理。

插入情景1:紅黑樹為空樹

最簡單的一種情景,直接把插入結點作為根結點就行,但注意,根據紅黑樹性質2:根節點是黑色。還需要把插入結點設為黑色。

處理:把插入結點作為根結點,並把結點設置為黑色

插入情景2:插入結點的Key已存在

插入結點的Key已存在,既然紅黑樹總保持平衡,在插入前紅黑樹已經是平衡的,那麼把插入結點設置為將要替代結點的顏色,再把結點的值更新就完成插入。

處理:

把I設為當前結點的顏色

更新當前結點的值為插入結點的值

插入情景3:插入結點的父結點為黑結點

由於插入的結點是紅色的,當插入結點的黑色時,並不會影響紅黑樹的平衡,直接插入即可,無需做自平衡。

處理:直接插入

插入情景4:插入結點的父結點為紅結點

再次回想下紅黑樹的性質2:根結點是黑色。如果插入的父結點為紅結點,那麼該父結點不可能為根結點,所以插入結點總是存在祖父結點。這點很重要,因為後續的旋轉操作肯定需要祖父結點的參與。

情景4又分為很多子情景,下面將進入重點部分,各位看官請留神了。

插入情景4.1:叔叔結點存在並且為紅結點
從紅黑樹性質4可以,祖父結點肯定為黑結點,因為不可以同時存在兩個相連的紅結點。那麼此時該插入子樹的紅黑層數的情況是:黑紅紅。顯然最簡單的處理方式是把其改為:紅黑紅。如圖9和圖10所示。

處理:

將P和S設置為黑色

將PP設置為紅色

把PP設置為當前插入結點

圖9 插入情景4.1_1

圖10 插入情景4.1_2

可以看到,我們把PP結點設為紅色了,如果PP的父結點是黑色,那麼無需再做任何處理;但如果PP的父結點是紅色,根據性質4,此時紅黑樹已不平衡了,所以還需要把PP當作新的插入結點,繼續做插入操作自平衡處理,直到平衡為止。

試想下PP剛好為根結點時,那麼根據性質2,我們必須把PP重新設為黑色,那麼樹的紅黑結構變為:黑黑紅。換句話說,從根結點到葉子結點的路徑中,黑色結點增加了。這也是唯一一種會增加紅黑樹黑色結點層數的插入情景

我們還可以總結出另外一個經驗:紅黑樹的生長是自底向上的。這點不同於普通的二叉查找樹,普通的二叉查找樹的生長是自頂向下的。

插入情景4.2:叔叔結點不存在或為黑結點,並且插入結點的父親結點是祖父結點的左子結點
單純從插入前來看,也即不算情景4.1自底向上處理時的情況,叔叔結點非紅即為葉子結點(Nil)。因為如果叔叔結點為黑結點,而父結點為紅結點,那么叔叔結點所在的子樹的黑色結點就比父結點所在子樹的多了,這不滿足紅黑樹的性質5。後續情景同樣如此,不再多做說明了。

前文說了,需要旋轉操作時,肯定一邊子樹的結點多了或少了,需要租或借給另一邊。插入顯然是多的情況,那麼把多的結點租給另一邊子樹就可以了。

插入情景4.2.1:插入結點是其父結點的左子結點
處理:

圖11 插入情景4.2.1

由圖11可得,左邊兩個紅結點,右邊不存在,那麼一邊一個剛剛好,並且因為為紅色,肯定不會破壞樹的平衡。

咦,可以把PP設為紅色,I和P設為黑色嗎?答案是可以!看過《算法:第4版》的同學可能知道,書中講解的就是把PP設為紅色,I和P設為黑色。但把PP設為紅色,顯然又會出現情景4.1的情況,需要自底向上處理,做多了無謂的操作,既然能自己消化就不要麻煩祖輩們啦~

插入情景4.2.2:插入結點是其父結點的右子結點
這種情景顯然可以轉換為情景4.2.1,如圖12所示,不做過多說明了。

處理:

對P進行左旋

把P設置為插入結點,得到情景4.2.1

進行情景4.2.1的處理

圖12 插入情景4.2.2

插入情景4.3:叔叔結點不存在或為黑結點,並且插入結點的父親結點是祖父結點的右子結點
該情景對應情景4.2,只是方向反轉,不做過多說明了,直接看圖。

插入情景4.3.1:插入結點是其父結點的右子結點
處理:

圖13 插入情景4.3.1

插入情景4.3.2:插入結點是其父結點的右子結點
處理:

對P進行右旋

把P設置為插入結點,得到情景4.3.1

進行情景4.3.1的處理

圖14 插入情景4.3.2

好了,講完插入的所有情景了。可能又同學會想:上面的情景舉例的都是第一次插入而不包含自底向上處理的情況,那麼上面所說的情景都適合自底向上的情況嗎?答案是肯定的。理由很簡單,但每棵子樹都能自平衡,那麼整棵樹最終總是平衡的。好吧,在出個習題,請大家拿出筆和紙畫下試試(請務必動手畫下,加深印象):

習題1:請畫出圖15的插入自平衡處理過程。(答案見文末)

圖15 習題1

紅黑樹刪除

紅黑樹插入已經夠複雜了,但刪除更複雜,也是紅黑樹最複雜的操作了。但穩住,勝利的曙光就在前面了!

紅黑樹的刪除操作也包括兩部分工作:一查找目標結點;而刪除後自平衡。查找目標結點顯然可以復用查找操作,當不存在目標結點時,忽略本次操作;當存在目標結點時,刪除後就得做自平衡處理了。刪除了結點後我們還需要找結點來替代刪除結點的位置,不然子樹跟父輩結點斷開了,除非刪除結點剛好沒子結點,那麼就不需要替代。

二叉樹刪除結點找替代結點有3種情情景:

補充說明下,情景3的後繼結點是大於刪除結點的最小結點,也是刪除結點的右子樹種最右結點。那麼可以拿前繼結點(刪除結點的左子樹最左結點)替代嗎?可以的。但習慣上大多都是拿後繼結點來替代,後文的講解也是用後繼結點來替代。另外告訴大家一種找前繼和後繼結點的直觀的方法(不知為何沒人提過,大家都知道?):把二叉樹所有結點投射在X軸上,所有結點都是從左到右排好序的,所有目標結點的前後結點就是對應前繼和後繼結點。如圖16所示。

圖16 二叉樹投射x軸後有序

接下來,講一個重要的思路:刪除結點被替代後,在不考慮結點的鍵值的情況下,對於樹來說,可以認為刪除的是替代結點!話很蒼白,我們看圖17。在不看鍵值對的情況下,圖17的紅黑樹最終結果是刪除了Q所在位置的結點!這種思路非常重要,大大簡化了後文講解紅黑樹刪除的情景!

圖17 刪除結點換位思路

基於此,上面所說的3種二叉樹的刪除情景可以相互轉換並且最終都是轉換為情景1!

二叉樹刪除結點情景關係圖如圖18所示。

圖18 二叉樹刪除情景轉換

綜上所述,刪除操作刪除的結點可以看作刪除替代結點,而替代結點最後總是在樹末。有了這結論,我們討論的刪除紅黑樹的情景就少了很多,因為我們只考慮刪除樹末結點的情景了。

同樣的,我們也是先來總體看下刪除操作的所有情景,如圖19所示。

圖19 紅黑樹刪除情景

哈哈,是的,即使簡化了還是有9種情景!但跟插入操作一樣,存在左右對稱的情景,只是方向變了,沒有本質區別。同樣的,我們還是來約定下,如圖20所示。

圖20 刪除操作結點的叫法約定

圖20的字母並不代表結點Key的大小。R表示替代結點,P表示替代結點的父結點,S表示替代結點的兄弟結點,SL表示兄弟結點的左子結點,SR表示兄弟結點的右子結點。灰色結點表示它可以是紅色也可以是黑色。

值得特別提醒的是,R是即將被替換到刪除結點的位置的替代結點,在刪除前,它還在原來所在位置參與樹的子平衡,平衡後再替換到刪除結點的位置,才算刪除完成。

萬事具備,我們進入最後的也是最難的講解。

刪除情景1:替換結點是紅色結點

我們把替換結點換到了刪除結點的位置時,由於替換結點時紅色,刪除也了不會影響紅黑樹的平衡,只要把替換結點的顏色設為刪除的結點的顏色即可重新平衡。

處理:顏色變為刪除結點的顏色

刪除情景2:替換結點是黑結點

當替換結點是黑色時,我們就不得不進行自平衡處理了。我們必須還得考慮替換結點是其父結點的左子結點還是右子結點,來做不同的旋轉操作,使樹重新平衡。

刪除情景2.1:替換結點是其父結點的左子結點
刪除情景2.1.1:替換結點的兄弟結點是紅結點
若兄弟結點是紅結點,那麼根據性質4,兄弟結點的父結點和子結點肯定為黑色,不會有其他子情景,我們按圖21處理,得到刪除情景2.1.2.3(後續講解,這裡先記住,此時R仍然是替代結點,它的新的兄弟結點SL和兄弟結點的子結點都是黑色)。

處理:

將S設為黑色

將P設為紅色

對P進行左旋,得到情景2.1.2.3

進行情景2.1.2.3的處理

圖21 刪除情景2.1.1

刪除情景2.1.2:替換結點的兄弟結點是黑結點
當兄弟結點為黑時,其父結點和子結點的具體顏色也無法確定(如果也不考慮自底向上的情況,子結點非紅即為葉子結點Nil,Nil結點為黑結點),此時又得考慮多種子情景。

刪除情景2.1.2.1:替換結點的兄弟結點的右子結點是紅結點,左子結點任意顏色
即將刪除的左子樹的一個黑色結點,顯然左子樹的黑色結點少1了,然而右子樹又又紅色結點,那麼我們直接向右子樹「借」個紅結點來補充黑結點就好啦,此時肯定需要用旋轉處理了。如圖22所示。

處理:

將S的顏色設為P的顏色

將P設為黑色

將SR設為黑色

對P進行左旋

圖22 刪除情景2.1.2.1

平衡後的圖怎麼不滿足紅黑樹的性質?前文提醒過,R是即將替換的,它還參與樹的自平衡,平衡後再替換到刪除結點的位置,所以R最終可以看作是刪除的。另外圖2.1.2.1是考慮到第一次替換和自底向上處理的情況,如果只考慮第一次替換的情況,根據紅黑樹性質,SL肯定是紅色或為Nil,所以最終結果樹是平衡的。如果是自底向上處理的情況,同樣,每棵子樹都保持平衡狀態,最終整棵樹肯定是平衡的。後續的情景同理,不做過多說明了。

刪除情景2.1.2.2:替換結點的兄弟結點的右子結點為黑結點,左子結點為紅結點
兄弟結點所在的子樹有紅結點,我們總是可以向兄弟子樹借個紅結點過來,顯然該情景可以轉換為情景2.1.2.1。圖如23所示。

處理:

將S設為紅色

將SL設為黑色

對S進行右旋,得到情景2.1.2.1

進行情景2.1.2.1的處理

圖23 刪除情景2.1.2.2

刪除情景2.1.2.3:替換結點的兄弟結點的子結點都為黑結點
好了,此次兄弟子樹都沒紅結點「借」了,兄弟幫忙不了,找父母唄,這種情景我們把兄弟結點設為紅色,再把父結點當作替代結點,自底向上處理,去找父結點的兄弟結點去「借」。但為什麼需要把兄弟結點設為紅色呢?顯然是為了在P所在的子樹中保證平衡(R即將刪除,少了一個黑色結點,子樹也需要少一個),後續的平衡工作交給父輩們考慮了,還是那句,當每棵子樹都保持平衡時,最終整棵總是平衡的。

處理:

將S設為紅色

把P作為新的替換結點

重新進行刪除結點情景處理

圖24 情景2.1.2.3

刪除情景2.2:替換結點是其父結點的右子結點
好啦,右邊的操作也是方向相反,不做過多說明了,相信理解了刪除情景2.1後,肯定可以理解2.2。

刪除情景2.2.1:替換結點的兄弟結點是紅結點
處理:

將S設為黑色

將P設為紅色

對P進行右旋,得到情景2.2.2.3

進行情景2.2.2.3的處理

圖25 刪除情景2.2.1

刪除情景2.2.2:替換結點的兄弟結點是黑結點
刪除情景2.2.2.1:替換結點的兄弟結點的左子結點是紅結點,右子結點任意顏色
處理:

將S的顏色設為P的顏色

將P設為黑色

將SL設為黑色

對P進行右旋

圖26 刪除情景2.2.2.1

刪除情景2.2.2.2:替換結點的兄弟結點的左子結點為黑結點,右子結點為紅結點
處理:

將S設為紅色

將SR設為黑色

對S進行左旋,得到情景2.2.2.1

進行情景2.2.2.1的處理

圖27 刪除情景2.2.2.2

刪除情景2.2.2.3:替換結點的兄弟結點的子結點都為黑結點
處理:

將S設為紅色

把P作為新的替換結點

重新進行刪除結點情景處理

圖28 刪除情景2.2.2.3

綜上,紅黑樹刪除後自平衡的處理可以總結為:

自己能搞定的自消化(情景1)

自己不能搞定的叫兄弟幫忙(除了情景1、情景2.1.2.3和情景2.2.2.3)

兄弟都幫忙不了的,通過父母,找遠方親戚(情景2.1.2.3和情景2.2.2.3)

哈哈,是不是跟現實中很像,當我們有困難時,首先先自己解決,自己無力了總兄弟姐妹幫忙,如果連兄弟姐妹都幫不上,再去找遠方的親戚了。這裡記憶應該會好記點~

最後再做個習題加深理解(請不熟悉的同學務必動手畫下):

***習題2:請畫出圖29的刪除自平衡處理過程。

寫在後面

耗時良久,終於寫完了~自己加深了紅黑樹的理解的同時,也希望能幫助大家。如果你之前沒學習過紅黑樹,看完這篇文章後可能還存在很多疑問,如果有疑問可以在評論區寫出來,我會儘自己所能解答。另外給大家推薦一個支持紅黑樹在線生成的網站,來做各種情景梳理很有幫助:在線生成紅黑樹。(刪除操作那個把替代結點看作刪除結點思路就是我自己在用這個網站時自己頓悟的,我覺得這樣講解更容易理解。)

少了代碼是不是覺得有點空虛?哈哈,後續我會寫關於Java和HashMap和TreeMap的文章,裡面都有紅黑樹相關的知識。相信看了這篇文章後,再去看Java和HashMap和TreeMap的源碼絕對沒難度!

最後來看下思考題和習題的答案吧。

思考題和習題答案

思考題1:黑結點可以同時包含一個紅子結點和一個黑子結點嗎?
答:可以。如下圖的F結點:

習題1:請畫出圖15的插入自平衡處理過程。
答:

習題2:請畫出圖29的刪除自平衡處理過程。
答:

作者:安卓大叔

www.jianshu.com/p/e136ec79235c

推薦閱讀:

0.JAVA面試視頻+題庫+筆試+簡歷模板     

1.java最新全套視頻學習資料(從入門到實戰項目)

看完本文有收穫?請轉發分享給更多人。

關注「Java小組」,做頂尖程式設計師!

相關焦點

  • 阿里員工吐槽:手撕AVL和紅黑樹,字節跳動面試真的太無聊!
    前言:中國自古就有文人相輕的傳統,文人相輕真沒有什麼要緊的,就像是小夫妻似的鬥鬥氣拌拌嘴,然後還可以理直氣壯地拿稿費,何樂而不為?而在程式設計師屆也有一種技術相輕,相互鄙視,相互嫌棄,總會用技術來證明自己比對方強。
  • 漫畫:什麼是紅黑樹?
    什麼情況下會破壞紅黑樹的規則,什麼情況下不會破壞規則呢?我們舉兩個簡單的慄子:1.向原紅黑樹插入值為14的新節點:由於父節點22是紅色節點,因此這種情況打破了紅黑樹的規則4(每個紅色節點的兩個子節點都是黑色),必須進行調整,使之重新符合紅黑樹的規則。
  • 騰訊面試題:有了二叉查找樹、平衡樹為啥還需要紅黑樹?
    本文作者:帥地紅黑樹算是很難的一種數據結構吧,一般很少考察插入、刪除等具體操作步驟,如果遇到要你手寫紅黑樹的面試官,就直接告辭吧。所以,更多是會考察你對紅黑樹的理解程度,考察的最多的估計就是為什麼有了二查找查找樹/平衡樹還需要紅黑樹這個問題了,今天,你只需要花一分鐘的時間,就知道怎麼回答這個問題了。
  • 面試感悟:3年工作經驗java程式設計師應有的技能
    6、框架老生常談,面試必問的東西。一般來說會問你一下你們項目中使用的框架,然後給你一些場景問你用框架怎麼做,比如我想要在Spring初始化bean的時候做一些事情該怎麼做、想要在bean銷毀的時候做一些事情該怎麼做、MyBatis中$和#的區別等等,這些都比較實際了,平時積累得好、有多學習框架的使用細節自然都不成問題。
  • (面試感悟)一名3年工作經驗的程式設計師應該具備的技能
    7、框架老生常談,面試必問的東西。一般來說會問你一下你們項目中使用的框架,然後給你一些場景問你用框架怎麼做,比如我想要在Spring初始化bean的時候做一些事情該怎麼做、想要在bean銷毀的時候做一些事情該怎麼做、MyBatis中$和#的區別等等,這些都比較實際了,平時積累得好、有多學習框架的使用細節自然都不成問題。
  • 一名3年工作經驗的Java程式設計師應該具備哪些技能
    3、框架老生常談,面試必問的東西。一般來說會問你一下你們項目中使用的框架,然後給你一些場景問你用框架怎麼做,比如我想要在Spring初始化bean 的時候做一些事情該怎麼做、想要在bean銷毀的時候做一些事情該怎麼做、MyBatis中$和#的區別等等,這些都比較實際了,平時積累得好、有多學習 框架的使用細節自然都不成問題。
  • 多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...
    應用場景:二叉查找樹的有序性是它能夠廣泛應用的原因。但是能否高效二分體現在樹的高度合理性上。下面要講的 紅黑樹/堆結構才是其廣泛應用。紅黑樹二叉查找樹的缺點在於:只限制了節點的有序性,但有序樹的構造有好壞。一顆「壞」的有序樹直接會被拉成 「有序鍊表」。所以需要通過一定的條件保證樹的平衡性。
  • 淺談樹形結構:多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...
    應用場景:二叉查找樹的有序性是它能夠廣泛應用的原因。但是能否高效二分體現在樹的高度合理性上。下面要講的 紅黑樹/堆結構才是其廣泛應用。紅黑樹二叉查找樹的缺點在於:只限制了節點的有序性,但有序樹的構造有好壞。一顆「壞」的有序樹直接會被拉成 「有序鍊表」。所以需要通過一定的條件保證樹的平衡性。
  • 算法連載之紅黑樹
    紅黑樹二叉搜索樹的基本操作取決於樹的高度,當樹較低時,基本操作較快。但當樹較高時,也就是不平衡時,速度並不比鍊表執行速度更快。其中紅黑樹是平衡搜索樹中的一種,可以保證基本操作在最壞情況下的時間複雜度是O(lgn)。
  • 圖解:數據結構中的6種「樹」,檸檬問你心中有數嗎?
    今天就帶大家一起學習下,數據結構中的各種「樹」,這也是面試中經常考察的內容,手撕二叉樹是常規套路,對候選人也很有區分度,學完這篇文章,相信大家都會心中有「樹」了。從樹說起什麼是樹?現實中的樹大家都見過,在數據結構中也有樹,此樹非彼樹,不過數據結構的樹和現實中的樹在形態上確實有點相像。
  • 程式設計師的三大難題:禿頂、面試、找女朋友
    多數程式設計師都不太喜歡跟外行解釋程式設計師到底是幹什麼的,但是因為白板面試太遭程式設計師恨了,以至於多數也不得不跟外行吐槽什麼是白板面試,可見白板面試到底有多讓人頭疼。很多人都覺得白板面試飽受詬病,但是不論國內外,白板面試反倒是越來越火。
  • 我面試必問的一個問題
    最近是跳槽的高峰,很多人應該都在準備面試,我知識星球有球友問我面試需要注意什麼事項
  • 如何從菜雞變成收割機,大廠面試的算法,你懂了嗎?
    是什麼?讓大廠面試顯得逼格很高,是算法和數據結構嗎?是的!!!Google工程師曾總結過,大廠之所以愛考察算法和數據結構是因為:算法能力能夠準確辨別一個程式設計師的技術功底是否紮實;算法能力是發掘程式設計師的學習能力與成長潛力的關鍵手段;算法能力能夠協助判斷程式設計師在面對新問題時,分析並解決問題的能力;算法能力是設計一個高性能系統、性能優化的必備基礎。
  • 程式設計師面試被問離職原因,如實回答不適應996,面試官答覆尷尬了
    最近,有個程式設計師就在網上吐槽說,自己原單位加班很嚴重,長期996(即早上9點上班,晚上9點下班,每周工作6天)雖然工資收入很高,但這種狀態影響到了身心健康,並對私人生活造成了很大的影響,於是就計劃跳槽到一個加班壓力相對不大的公司。面試幾次後,和一個公司在工作內容、待遇等方面都談得很妥當了。
  • 簡單的面試題目,大跌眼鏡的結果(JAVA)
    所以越來越多的組織會採用電話面試的方式,進行初步篩選。題目難度一再降低,結果卻大跌眼鏡,HR都哭了。以下是一個簡單統計,樣本幾百人不等,能夠全部答上來的,不超過10%。哦,全錯的也有!快來看看我這b裝的分數高,還是你得的分數高,滿分10分!
  • 程式設計師才看得明白的面試聖經
    如果足夠幸運的話,現在當你開始在白板左上角動筆的時候,應該非常明白你要寫些什麼東西,而且你要確保在你寫答案的時候,沒有擋住面試官的視線。花點兒時間把代碼寫得緊湊而美觀一點兒,因為你的代碼也會是面試反饋的一部分。在你寫代碼的時候,要大聲解釋你在寫什麼,這會讓你的面試官更容易地跟上你的思路。6、最後,用不同的例子和特殊案例驗證一下你的代碼,並且要一行一行地過。
  • 有關 HashMap 面試會問的一切
    TreeSet: 採用紅黑樹結構,特點是可以有序,可以用自然排序或者自定義比較器來排序;缺點就是查詢速度沒有 HashSet 快。TreeMap: 是有序的,本質是用二叉搜索樹來實現的。>鍊表存儲的,這樣如果碰撞很多的話,就變成了在鍊表上的查找,worst case 就是 O(n);在 JDK 1.8 進行了優化,當鍊表長度較大時(超過 8),會採用紅黑樹來存儲,這樣大大提高了查找效率。
  • (二叉樹)
    有同學會把紅黑樹和二叉平衡搜索樹弄分開了,其實紅黑樹就是一種二叉平衡搜索樹,這兩個樹不是獨立的,所以C++中map、multimap、set、multiset的底層實現機制是二叉平衡搜索樹,再具體一點是紅黑樹。
  • 面試官問程式設計師:人照鏡子,為啥上下不顛倒,而左右會顛倒
    面試網際網路公司的朋友們都知道,網際網路公司的面試問題都很奇葩。在這裡,你能遇到各種各樣奇怪的問題,而今天一個程式設計師去技術面試,就遭到了面試官的古怪一問。面試官問他:人照鏡子的時候,為啥上下不會顛倒,而左右會顛倒?這個程式設計師表示自己回答了很多,但面試官都舉反例反駁了。所以這個程式設計師就想問問網友們,這答案到底是什麼呢?
  • 新手程式設計師注意了:程式設計師老鳥教你如何準備面試!
    相信對於很多剛畢業的新手程式設計師來說,如何找到一份工作?如何準備自己的面試?相比而言還是比較迷茫的!畢竟很多新手都存在研發經驗相對較少或者直接沒有研發經驗的情況。這種情況下,小夥伴對求職過程中的面試環節了相比而言還是比較擔心的,這一點小編也是深有體會的。