Java面试你必须要知道的那些知识,面试建议
二、面試題
面:考你幾個(gè)紅黑樹的知識點(diǎn)🦀
面:2-3樹都是不沒看,回去等消息吧!
三、2-3樹與紅黑樹的等價(jià)性
紅黑樹規(guī)則
1. 根節(jié)點(diǎn)是黑色 2. 節(jié)點(diǎn)是紅黑或者黑色 3. 所有子葉節(jié)點(diǎn)都是黑色(葉子是NIL節(jié)點(diǎn),默認(rèn)沒有畫出來) 4. 每個(gè)紅色節(jié)點(diǎn)必須有兩個(gè)黑色子節(jié)點(diǎn)(也同樣說明一條鏈路上不能有鏈路的紅色節(jié)點(diǎn)) 5. 黑高,從任一節(jié)點(diǎn)到齊每個(gè)葉子節(jié)點(diǎn),經(jīng)過的路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)那么,這些規(guī)則是怎么總結(jié)定義出來的呢?接下里我們一步步分析講解。
1. 為什么既有2-3樹要有紅黑樹
首先2-3樹(讀法:二三樹)就是一個(gè)節(jié)點(diǎn)有1個(gè)或者2個(gè)元素,而實(shí)際上2-3樹轉(zhuǎn)紅黑樹是由概念模型2-3-4樹轉(zhuǎn)換而來的。-4叉就是一個(gè)節(jié)點(diǎn)里有3個(gè)元素,這在2-3樹中會被調(diào)整,但是在概念模型中是會被保留的。
雖然2-3-4樹也是具備2-3樹同樣的平衡樹的特性,但是如果直接把這樣的模型用代碼實(shí)現(xiàn)就會很麻煩,且效率不高,這里的復(fù)雜點(diǎn)包括;
所以,希望找到一種平衡關(guān)系,既保持2-3樹平衡和O(logn)的特性,又能在代碼實(shí)現(xiàn)上更加方便,那么就誕生了紅黑樹。
2. 簡單2-3樹轉(zhuǎn)紅黑樹
2-3樹轉(zhuǎn)紅黑樹,也可以說紅黑樹是2-3樹和2-3-4樹的另外一種表現(xiàn)形式,也就是更利于編碼實(shí)現(xiàn)的形式。
簡單轉(zhuǎn)換示例;
從上圖可以看出,2-3-4樹與紅黑樹的轉(zhuǎn)換關(guān)系,包括;
綜上,就是2-3-4樹的節(jié)點(diǎn)轉(zhuǎn)換,總結(jié)出來的規(guī)則,如下;
3. 復(fù)雜2-3樹轉(zhuǎn)紅黑樹
在簡單2-3樹轉(zhuǎn)換紅黑樹的過程中,了解到一個(gè)基本的轉(zhuǎn)換規(guī)則右旋定義,接下來我們在一個(gè)稍微復(fù)雜一點(diǎn)的2-3樹與紅黑樹的對應(yīng)關(guān)系,如下圖;
上圖是一個(gè)稍微復(fù)雜點(diǎn)的2-3樹,轉(zhuǎn)換為紅黑樹的過程,是不這樣一張圖讓你對紅黑樹更有感覺了,同時(shí)它也滿足一下條件;
四、紅黑樹
1. 平衡操作
通過在上一章節(jié)2-3樹的學(xué)習(xí),在插入節(jié)點(diǎn)時(shí)并不會插到空位置,而是與現(xiàn)有節(jié)點(diǎn)融合以及調(diào)整,保持整個(gè)樹的平衡。
而紅黑樹是2-3-4樹的一種概念模型轉(zhuǎn)換而來,在插入節(jié)點(diǎn)時(shí)通過紅色鏈接相連,也就是插入紅色節(jié)點(diǎn)。插入完成后進(jìn)行調(diào)整,以保持樹接近平衡。
那么,為了讓紅黑樹達(dá)到平衡狀態(tài),主要包括染色、?左右旋轉(zhuǎn)、這些做法其實(shí)都是從2-3樹演化過來的。接下來我們就分別講解幾種規(guī)則的演化過程,以此更好了解紅黑樹的平衡操作。
1.1 左旋轉(zhuǎn)
左旋定義: 把一個(gè)向右傾斜的紅節(jié)點(diǎn)鏈接(2-3樹,3-叉雙元素節(jié)點(diǎn)),轉(zhuǎn)化為左鏈接。
背景:順序插入元素,1、2、3,2-3樹保持平衡,紅黑樹暫時(shí)處于右傾斜。
接下來我們分別對比兩種樹結(jié)構(gòu)的平衡操作;
紅黑樹的左旋,只會處理與之對應(yīng)的2-3樹節(jié)點(diǎn)進(jìn)行操作,不會整體改變。
1.2 右旋轉(zhuǎn)
右旋定義: 把一個(gè)向左傾斜的紅節(jié)點(diǎn)連接(2-3樹,3-叉雙元素節(jié)點(diǎn)),轉(zhuǎn)換為右連接。
背景:順序插入元素,3、1、1,2-3樹保持平衡,紅黑樹暫時(shí)處于左傾斜。
接下來我們分別對比兩種樹結(jié)構(gòu)的平衡操作;
你會發(fā)現(xiàn),左旋與右旋是相互對應(yīng)的,但在2-3樹中是保持不變的
1.3 左右旋綜合運(yùn)用
左旋、右旋,我們已經(jīng)有了一個(gè)基本的概念,那么接下來我們再看一個(gè)可以綜合左右旋以及對應(yīng)2-3樹的演化案例,如下;
以上的例子分別演示了一個(gè)元素插入的三種情況,如下;
1.4 染色
在2-3樹中,插入一個(gè)節(jié)點(diǎn),為了保持樹平衡是不插入到空位置上的,當(dāng)插入節(jié)點(diǎn)后元素?cái)?shù)量有3個(gè)后則需要調(diào)整中間元素向上,來保持樹平衡。與之對應(yīng)的紅黑樹則需要調(diào)整顏色,來保證紅黑樹的平衡規(guī)則,具體參考如下;
2. 旋轉(zhuǎn)+染色運(yùn)用案例
接下來我們把上面講解到的旋轉(zhuǎn)、染色,運(yùn)用到一個(gè)實(shí)際案例中,如下圖;
- 首先從左側(cè)開始,是一個(gè)按照順序插入生產(chǎn)出來的紅黑樹,插入順序;7、2、8、1、4、3、5
- α,向目前紅黑樹插入元素6,插入后右下角有三個(gè)紅色節(jié)點(diǎn);3、5、6。
- β,因?yàn)橛蚁陆菨M足染色條件,變換后;黑色節(jié)點(diǎn)(3、5)、紅色節(jié)點(diǎn)(4、6)。
- γ,之后看被紅色連線鏈接的節(jié)點(diǎn)7、4、2,最小節(jié)點(diǎn)在中間,左旋平衡樹結(jié)構(gòu)。
- δ,左旋完成后,紅色鏈接線的7、4、2為做傾順序節(jié)點(diǎn),因此需要做右旋操作。
- ε,左旋、右旋,調(diào)整完成后,又滿足了染色操作。到此恢復(fù)紅黑樹平衡。
注意,所有連接紅色節(jié)點(diǎn)的,都是是紅色線。以此與2-3樹做對應(yīng)。
3. 刪除操作
根據(jù)2-3-4樹模型的紅黑樹,在刪除的時(shí)候基本是按照2-3方式進(jìn)行刪除,只不過在這個(gè)過程中需要染色和旋轉(zhuǎn)操作,以保持樹平衡。刪除過程主要可以分為如圖四種情況,如下;
3.1 刪除子葉紅色節(jié)點(diǎn)
紅色子葉節(jié)點(diǎn)的刪除并不會破壞樹平衡,也不影響樹高,所以直接刪除即可,如下;
3.2 刪除左側(cè)節(jié)點(diǎn)
3.2.1 被刪節(jié)點(diǎn)兄弟為黑色&含右子節(jié)點(diǎn)
3.2.2 被刪節(jié)點(diǎn)兄弟為黑色&含左子節(jié)點(diǎn)
3.2.3 被刪節(jié)點(diǎn)兄弟為黑色&含雙子節(jié)點(diǎn)(紅)
3.2.4 被刪節(jié)點(diǎn)兄弟為黑色&不含子節(jié)點(diǎn)
3.2.5 被刪節(jié)點(diǎn)兄弟為黑色&含雙黑節(jié)點(diǎn)(黑)
3.3. 刪除右側(cè)節(jié)點(diǎn)
3.3.1 被刪節(jié)點(diǎn)兄弟為黑色&含左子節(jié)點(diǎn)
3.3.2 被刪節(jié)點(diǎn)兄弟為黑色&含右子節(jié)點(diǎn)
3.3.3 被刪節(jié)點(diǎn)兄弟為黑色&含雙子節(jié)點(diǎn)(紅)
3.2.4 被刪節(jié)點(diǎn)兄弟為黑色&不含子節(jié)點(diǎn)
3.2.5 被刪節(jié)點(diǎn)兄弟為黑色&含雙黑節(jié)點(diǎn)(黑)
最后
即使是面試跳槽,那也是一個(gè)學(xué)習(xí)的過程。只有全面的復(fù)習(xí),才能讓我們更好的充實(shí)自己,武裝自己,為自己的面試之路不再坎坷!今天就給大家分享一個(gè)Github上全面的Java面試題大全,就是這份面試大全助我拿下大廠Offer,月薪提至30K!
資料領(lǐng)取方式:藍(lán)色傳送門
我也是第一時(shí)間分享出來給大家,希望可以幫助大家都能去往自己心儀的大廠!為金三銀四做準(zhǔn)備!
一共有20個(gè)知識點(diǎn)專題,分別是:
Dubbo面試專題
JVM面試專題
Java并發(fā)面試專題
Kafka面試專題
MongDB面試專題
MyBatis面試專題
MySQL面試專題
Netty面試專題
RabbitMQ面試專題
Redis面試專題
Spring Cloud面試專題
SpringBoot面試專題
zookeeper面試專題
常見面試算法題匯總專題
計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)專題
設(shè)計(jì)模式專題
[外鏈圖片轉(zhuǎn)存中…(img-38gvEK3Z-1626344127956)]
zookeeper面試專題
[外鏈圖片轉(zhuǎn)存中…(img-x1BcUbtV-1626344127957)]
常見面試算法題匯總專題
[外鏈圖片轉(zhuǎn)存中…(img-7RtszomX-1626344127957)]
計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)專題
[外鏈圖片轉(zhuǎn)存中…(img-xhS1PIPy-1626344127958)]
設(shè)計(jì)模式專題
[外鏈圖片轉(zhuǎn)存中…(img-B81wVGev-1626344127959)]
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java面试你必须要知道的那些知识,面试建议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: emuelec下好如何解压到移动硬盘里
- 下一篇: 成都欢乐谷做几号线