紅黑樹來說點別人沒說過的東西 一

2021-10-09 07:22:11 字數 1286 閱讀 6116

a. parent 為紅, uncle為紅, 則可以推算出gparent為黑(紅色的節點不可能相連)

b. 紅色節點插入以後, parent和uncle變為黑色, gparent變為紅色

c. gparent變紅, 黑色-1; parent變黑, uncle變黑, 黑色+2 ===> 黑色節點的總數+1

d. summary:

變色並不會影響從gparent出發到其所有子樹葉節點路徑上的黑節點數

原來gparent為黑,但是parent和uncle為紅;現在gparent為紅,parent和uncle為黑,所以黑色的節點數保持不變

變色會break紅黑樹的定義,gparent本來為黑,所以parent(gparent)為紅或者黑均可以,但是gparent變紅以後, parent(gparent)就只能為黑了,所以可能需要進一步變色或者rotation

ggp                 ggp             a. rightrotation rotation之前ggp的顏色未知, gp的顏色必為黑,因為發生rotation時,p為紅,u為黑

| | b. rightrotation rotation過後新的gp為變成黑色的pr

gp(b) pr(b) c. 曾經的gp變色為紅, ub保持不變

/ \ / \ d. 原來ggp - gp - pr - nr上的黑色點數為1

pr ub nr gp(r) ggp - gp - pr - ?0 上的黑色點數為1 + 黑色點數(?0)

/\ /\ /\ ggp - gp - ub - ?1 / ?2 上的黑色點數為2 + 黑色點數(?1 / ?2)

nr ?0 ?1 ?2 ?0 ub e. 變化過後 ggp - pr - nr 上的黑色點數為1

/\ ggp - pr - gp - ?0上的黑色點數為1 + 黑色點數(?0)

?1 ?2 ggp - pr - ub - ?1 / ?2 上的黑色點數為2 + 黑色點數(?1 / ?2)

由此可知,roatation並沒有改變ggp任何子樹上的黑色點的個數

乙個很有用的視覺化操作紅黑樹的**:

紅黑樹的原理 關於紅黑樹原理的一些介紹

紅黑樹 red black tree 是一種重要的資料結構,也經常會用到,c 的map就是使用紅黑樹來實現的。在程式設計師找工作的面試中,紅黑樹也是經常被問到的乙個知識點,我也是當時從找工作的時候嘗試去理解紅黑樹的一些結構和原理,但是由於找工作時間比較緊張,而且要了解的知識點比較多,所以當時對它也沒...

一顆紅黑樹的實現

大佬部落格 這顆紅黑樹是我看了大佬部落格的原理之後的手擼版本,實在是不夠優雅.這裡只是留作紀念,相信等我看完hashmap原始碼以後一定會有不一樣的感覺吧 經過測試,這顆紅黑樹複雜度還達不到完全的log,但是數量級是一樣的.在資料量為1e6時,log 1e6 應該是20,但是遞迴層數穩定在25左右 ...

關於實現紅黑樹的一些總結

一開始是打算照著 stl 寫的,結果發現乙個尷尬的情況 沒有allocator,std config.h,iterator,所以這個 rbtree1 就擱置了。後來 開始搞 rbtree2 又碰到了乙個很麻煩的問題。stl 原始碼裡面有乙個實現技巧 紅黑樹結點的結構是這樣的,還有乙個 templat...