《C演算法》筆記13 30行內寫出紅黑樹

2021-07-06 05:04:34 字數 1318 閱讀 8866

30行當然是不夠的,插入程式也沒有考慮資料項相等時不需要處理的特殊情況。但是插入只用了32行,包括括號、注釋在內,可見紅黑樹的優美。

簡單的說,做乙個小改造就可以在二叉平衡樹的基礎上構造出一棵紅黑樹,同時保留2-3-4樹的性質。將每個節點加入乙個顏色屬性,代表和父節點的連通性。紅色代表該節點和父節點連在一起,相當於2-3-4樹中的3節點一部分或者4節點的一部分,黑色代表該節點和父節點分離,相當於2節點或者4節點中間的那個。

2-3-4樹的所有操作都可以在紅黑樹中用相應的方法來實現。

1、**:底下的兩個紅色節點置黑。上部的黑色節點置紅。(相當於將上部節點和它的父節點結合,因為是二叉平衡樹,所以在結合前和結合後都保持了左小右大的性質)

2、插入:按照二叉平衡樹左小右大的性質插入。

3、平衡:為了平衡,4節點的實現採用了乙個黑父節點帶兩個紅子節點的方式。如果不是(也就是紅節點的某個子節點也是紅節點時)怎麼辦?旋轉。

紅黑樹有幾條性質,可以從2-3-4樹中找到對應的證明:

1)每個結點要麼是紅的,要麼是黑的。

定義。

2)根結點是黑的。

根節點沒有乙個能連線的父節點。

3)每個葉結點,即空結點(nil)是黑的。

空節點也不可能是3節點或者4節點的一部分。

4)如果乙個結點是紅的,那麼它的倆個兒子都是黑的。

實現3。

5)對每個結點,從該結點到其子孫結點的所有路徑上包含相同數目的黑結點。

2-3-4樹從根到所有葉子節點的路徑長度相等。

新建節點

rblink new_node(item item, rblink l, rblink r, bool red, int n)

左右旋

rblink rotr(rblink h)

rblink rotl(rblink h)

插入

這裡z是乙個終止的空節點。實際上,只有在插第乙個元素的時候會跳轉到h==z語句。

rblink _insert(rblink h, item item, int sw)

key ikey = key(item), hkey = key(h->item);

if(ikey < hkey)

}else

}return h;

}

html5行內元素 html5

html5是web中核心語言html的規範,使用者使用任何手段進行網頁瀏覽時看到的內容原本都是html格式的,在瀏覽器中通過一些技術處理將其轉換成為了可識別的資訊。小標題 html 1.塊級元素 獨佔一行,可設定寬高 可以巢狀 劃分區域的容器 語段標籤 編輯器常用 2.行內元素 都在一行內顯示,不能...

JS 操作樣式表1 行內樣式

訪問元素樣式1,stye屬性只對行內樣式有用 var box document.getelementbyid box alert box.style.color alert box.style.fontsize 對復合屬性的寫法是去掉中間的 並將第二個單詞大寫。alert box.style.flo...

前端日記01 行內元素和塊級元素

基本知識 分類速覽 塊級元素和行內元素的轉換 參考鏈結 hey,這裡是胖胖的部落格,目前正在學有關前端的知識,有時候會把一些遇到的問題記錄下來和大家一起分享交流,有錯誤的話請大家指正 從html的角度看標籤分為行內元素 內聯元素 inline 塊級元素 block 行內塊元素 inline bloc...