資料結構 紅黑樹

2021-08-30 15:58:36 字數 1781 閱讀 6165

紅黑樹怎麼來?歷史緣由

先說二叉樹,父節點劈叉出兩個節點,就兩個,不可以多。這樣一層一層下去。

再說二叉查詢樹(基於二分查詢),同樣有上面的劈叉屬性,但是呢左中右有大小順序,左邊小於中間,中間小於右邊。

接著就是紅黑樹,幹嘛上面下來就紅黑,二叉樹如果不加以控制就成單邊樹了。因為二叉樹沒規定不可以單邊開叉,而且一直往下開叉,5左單邊4再左單邊3,再左單邊2,類似的就失去了二叉查詢樹的意義了。這下紅黑就出來了。

紅黑為了達到樓上的特點就列出了五個特點

一、節點必須紅黑兩種顏色。treemap就用了boolean值分別表示

二、根節點必須黑色

三、沒個尾節點下面是黑色節點(感覺沒啥意義)

四、紅色節點下面或者上面不可以連續兩個出現

五、任意節點到他子節點經過的黑色節點個數一樣多。

那這玩意搞著五個條件無非就是限制插入,刪除。有人破壞樹的情況下,限制的。

例如,插入乙個節點,首先二分查詢節點,再fix。fix就為了滿足這五個規則。一般都是不符合後面這兩條。紅色不可以連著,任意節點到子節點黑色同樣個數。

jdk經典案例,treeset、treemap。上酒,小二。

就treemap原始碼分析。

一、treemap內部類子節點除了map中的key和value,還有左右節點和父節點,最後特有顏色(boolean值),遍歷都是一樣的。

static final class entryimplements map.entry

二、put查詢出要插入的位置,也就是父節點。  fixafterinsertion(e);這裡是重點。

public v put(k key, v value)

int cmp;

entryparent;

// split comparator and comparable paths

comparator<? super k> cpr = comparator;

if (cpr != null) while (t != null);

}else while (t != null);

}entrye = new entry<>(key, value, parent);

if (cmp < 0)

parent.left = e;

else

parent.right = e;

fixafterinsertion(e);

size++;

modcount++;

return null;

}三、重點  fixafterinsertion(e);

private void fixafterinsertion(entryx) else

//變換父親(黑色)和祖父顏色(紅色)

setcolor(parentof(x), black);

setcolor(parentof(parentof(x)), red);

//右轉祖父

rotateright(parentof(parentof(x)));

}} else else

//跟上面的操作一樣。父親黑色,祖父紅色

setcolor(parentof(x), black);

setcolor(parentof(parentof(x)), red);

//左轉祖父(發現都是左右轉交替)

rotateleft(parentof(parentof(x)));}}

}root.color = black;

}不強求記,畢竟像紅黑樹,外面大把的實現。

可以畫圖,進一步分析為啥,等有空再搞

資料結構 紅黑樹

紅黑樹是二叉排序樹的改進,紅黑樹有幾個特點 1 節點只有2中顏色,紅色和黑色。2 根節點一定是黑色節點。3 紅色節點的子節點一定是黑色節點。4 黑色高度 根節點到每個葉子節點的路徑長度包含相同的黑色節點 相等。規定的插入的節點一定是紅色節點,紅黑樹的插入節點後需要調整的規則,插入節點需要調整的情況有...

資料結構 紅黑樹

一 紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在 電腦科學中用到的一種 資料結構 典型的用途是實現 關聯陣列 可以保證最長路徑不超過最短路徑的2倍,近似平衡。二 性質 性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3 每個葉節點 nil節點,空節點 是黑色的。性質...

資料結構 紅黑樹

紅黑樹是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是紅色也可以是黑色。通過對任何一條從根到葉子簡單路徑上的顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡。紅黑樹滿足下面的性質 1 每個節點,不是紅色就是黑色的 2 根節點是黑色的 3 如果乙個節點是紅色的...