紅黑樹(shù)

紅黑樹(shù)

  1. 紅-黑樹(shù)的特征

平衡二叉搜索樹(shù):它是一棵空樹(shù)或它的左右兩個(gè)子樹(shù)的高度差的絕對(duì)值不超過(guò)1,并且左右兩個(gè)子樹(shù)都是一棵平衡二叉樹(shù).

時(shí)間復(fù)雜度:
常數(shù)階O(1)、對(duì)數(shù)階O(log2n)、線性階O(n)、線性對(duì)數(shù)階O(nlog2n)、平方階O(n2)、立方階O(n3)、k次方階O(nk)、指數(shù)階O(2n)。
https://blog.csdn.net/m0_37854317/article/details/70491581

二叉搜索樹(shù)作為一種數(shù)據(jù)結(jié)構(gòu),其查找、插入和刪除操作的時(shí)間復(fù)雜度都為O(logn),底數(shù)為2。
如果插入的數(shù)據(jù)是隨機(jī)的,則效率很高,但是如果插入的數(shù)據(jù)是有序的,比如10,20,30,40,50插入到二叉搜索樹(shù)中:
這和鏈表沒(méi)有任何區(qū)別了,查找的時(shí)間復(fù)雜度為O(N),而不是O(logN)。
當(dāng)然這是在最不平衡的條件下,實(shí)際情況下,二叉搜索樹(shù)的效率應(yīng)該在O(N)和O(logN)之間,這取決于樹(shù)的不平衡程度。

紅黑規(guī)則
1.每個(gè)節(jié)點(diǎn)不是紅色就是黑色的;
  2.根節(jié)點(diǎn)總是黑色的
  3.如果節(jié)點(diǎn)是紅色的,則它的子節(jié)點(diǎn)必須是黑色的(反之不一定),(也就是從每個(gè)葉子到根的所有路徑上不能有兩個(gè)連續(xù)的紅色節(jié)點(diǎn));
  4.從根節(jié)點(diǎn)到葉節(jié)點(diǎn)或空子節(jié)點(diǎn)的每條路徑,必須包含相同數(shù)目的黑色節(jié)點(diǎn)(即相同的黑色高度)
新插入的節(jié)點(diǎn)顏色總是紅色的,這是因?yàn)椴迦胍粋€(gè)紅色節(jié)點(diǎn)比插入一個(gè)黑色節(jié)點(diǎn)違背紅-黑規(guī)則的可能性更小

效率
紅黑樹(shù)的查找、插入和刪除時(shí)間復(fù)雜度都為O(log2N),額外的開(kāi)銷是每個(gè)節(jié)點(diǎn)的存儲(chǔ)空間都稍微增加了一點(diǎn),因?yàn)橐粋€(gè)存儲(chǔ)紅黑樹(shù)節(jié)點(diǎn)的顏色變量。
插入和刪除的時(shí)間要增加一個(gè)常數(shù)因子,因?yàn)橐M(jìn)行旋轉(zhuǎn),平均一次插入大約需要一次旋轉(zhuǎn),因此插入的時(shí)間復(fù)雜度還是O(log2N)
(時(shí)間復(fù)雜度的計(jì)算省略常數(shù)),但實(shí)際上比普通的二叉樹(shù)是要慢的。

大多數(shù)應(yīng)用中,查找的次數(shù)比插入和刪除的次數(shù)多,所以應(yīng)用紅黑樹(shù)取代普通的二叉搜索樹(shù)總體上不會(huì)有太多的時(shí)間開(kāi)銷。
而且紅黑樹(shù)的優(yōu)點(diǎn)是對(duì)于有序數(shù)據(jù)的操作不會(huì)慢到O(N)的時(shí)間復(fù)雜度。

  1. 紅-黑樹(shù)的自我修正
    在新增節(jié)點(diǎn)或者刪除節(jié)點(diǎn)之后,可能會(huì)破壞二叉樹(shù)的平衡。通過(guò)三種方式對(duì)平衡進(jìn)行修正
    改變顏色是為了幫助判斷何時(shí)旋轉(zhuǎn),而旋轉(zhuǎn)是為了保證樹(shù)的平衡。光改變節(jié)點(diǎn)顏色是不能起到任何作用的,旋轉(zhuǎn)才是關(guān)鍵的操作,
    節(jié)點(diǎn)本身是不會(huì)旋轉(zhuǎn)的,旋轉(zhuǎn)改變的是節(jié)點(diǎn)之間的關(guān)系。選擇一個(gè)節(jié)點(diǎn)作為旋轉(zhuǎn)的頂端,如果做一次右旋,
    這個(gè)頂端節(jié)點(diǎn)會(huì)向下和向右移動(dòng)到它右子節(jié)點(diǎn)的位置,它的左子節(jié)點(diǎn)會(huì)上移到它原來(lái)的位置。

①、改變節(jié)點(diǎn)顏色
 ?、凇⒂倚?br>   右旋的頂端節(jié)點(diǎn)必須要有左子節(jié)點(diǎn)。
 ?、?、左旋
左旋的頂端節(jié)點(diǎn)必須要有右子節(jié)點(diǎn)。

  1. 插入
    如果是第一次插入,由于原樹(shù)為空,所以只要把根節(jié)點(diǎn)涂黑即可;
    如果插入節(jié)點(diǎn)的父節(jié)點(diǎn)是黑色的,那不會(huì)違背紅-黑樹(shù)的規(guī)則,什么也不需要做;
    但是插入節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色的,有如下三種情況,就要開(kāi)始變色和旋轉(zhuǎn):

①、插入節(jié)點(diǎn)的父節(jié)點(diǎn)和其叔叔節(jié)點(diǎn)(祖父節(jié)點(diǎn)的另一個(gè)子節(jié)點(diǎn))均為紅色。

此時(shí)肯定存在祖父節(jié)點(diǎn),但是不知道父節(jié)點(diǎn)是其左子節(jié)點(diǎn)還是右子節(jié)點(diǎn),但是由于對(duì)稱性,我們只要討論出一邊的情況。
這種情況,將當(dāng)前節(jié)點(diǎn)(4) 的父節(jié)點(diǎn)(5) 和叔叔節(jié)點(diǎn)(8) 涂黑,將祖父節(jié)點(diǎn)(7)涂紅。
再將當(dāng)前節(jié)點(diǎn)指向其祖父節(jié)點(diǎn),再次從新的當(dāng)前節(jié)點(diǎn)開(kāi)始算法(具體看下面的步驟)。這樣上右圖就變成情況2了。

②、插入節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色的,叔叔節(jié)點(diǎn)是黑色的,且插入節(jié)點(diǎn)是其父節(jié)點(diǎn)的右子節(jié)點(diǎn)。

③、插入節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色的,叔叔節(jié)點(diǎn)是黑色的,且插入節(jié)點(diǎn)是其父節(jié)點(diǎn)的左子節(jié)點(diǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容