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