紅黑樹 插入

2021-10-10 05:19:37 字數 2519 閱讀 8753

嗯。。。總是忘。。。

再查以前做的筆記也好麻煩。。。於是將以前做的筆記重新整理、再整合其他優質內容,存到部落格上吧,方便以後看。。。

紅黑樹是許多"平衡"搜尋樹的一種,可以保證在最壞情況下基本動態操作集合的時間複雜度為o(lgn)

1、紅黑樹的性質

以上節選自《演算法導論《第三版》;

首先可以看到,紅黑樹是一顆二叉搜尋樹,那就簡單一提二叉搜尋樹,bst的特性:

某節點的左子樹節點值僅包含小於該節點值;

某節點的右子樹節點值僅包含大於該節點值;

左右子樹每個也必須是二叉查詢樹;

有一種情況,就是會形成"長腿",從程式的角度來說這個樹不夠平衡,查詢次數或時間複雜度 o(h)可能會隨著一條腿長無限增長;

紅黑樹其實就是去除二叉查詢樹頂端優勢的解決方案,從而達到樹的平衡(也就是,紅黑樹能夠做到:最長路徑不超過最短路徑的二倍,因而近似平衡);

2、紅黑樹的插入

紅黑樹插入節點過程大致分析:具體步驟如下:根節點為null,直接插入新節點並將其顏色置為黑色

根節點不為null,找到要插入新節點的位置

插入新節點

判斷新插入節點對全樹顏色的影響,更新調整顏色

插入節點預設顏色一定要為紅,如果為黑調節成本太大了;

紅黑樹有兩大操作:

recolor(重新標記黑色或紅色)

rotation(旋轉,這是樹達到平衡的關鍵)

先嘗試 recolor,如果 recolor 不能達到紅黑樹的 性質要求,然後我們嘗試 rotation,其實紅黑樹的關鍵玩法就是弄清楚 recolor 和 rotation 的規則。

演算法公式:

假設,新插入節點為x,其父節點為p(若有),叔節點為u(若有),祖節點為g(若有);

公式一:

1.將新插入的節點標記為紅色(新插入節點預設為紅色);

2.如果 x 是根結點(root),則標記為黑色;

3.如果 x 的 parent 是紅色(同時 x 也不是 root)、x 的 uncle (叔叔) 是紅色,

將 parent 和 uncle 標記為黑色、將 grand parent (祖父) 標記為紅色,

讓 x 祖父的顏色與x 節點的顏色相同:紅色,

然後重複步驟 2、3;

公式二:1.將新插入的節點標記為紅色(新插入節點預設為紅色);

2.如果 x 的 parent 是紅色(同時 x 也不是 root)、如果 x 的 叔節點u是黑色(包括u不存在的情況),我們要分四種情況處理:

左左 (p 是 g 的左孩子,並且 x 是 p 的左孩子)

左右 (p 是 g 的左孩子,並且 x 是 p 的右孩子)

右右 (p 是 g 的右孩子,並且 x 是 p 的右孩子)

右左 (p 是 g 的右孩子,並且 x 是 p 的左孩子)

左左:右旋

左右:px先左旋,這樣就回到了"左左情況":再右旋

右右:左旋

右左:px先右旋,這樣就回到了"右右"情況:再左旋

參考:知乎-老劉:紅黑樹,超強動靜圖詳解,簡單易懂:

**紅黑樹(rbtree)原理及實現:

紅黑樹(插入)

紅黑樹的插入操作相對刪除操作比較簡單。紅黑樹要滿足 任一節點至null的任何路徑,所含黑節點數必須相同。所以,為了滿足此性質,插入節點應該為紅色。如果插入節點的父親為黑色,則不需要進行調整,若為紅色,有三種情況需要討論。1.父節點為紅色,叔節點為紅色 對於這種情況,同時改變父 叔節點顏色為黑色,並將...

紅黑樹插入

一 什麼是紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。紅黑樹是一棵二叉搜尋樹,它在每個結點上增加了乙個儲存位來表示結點的顏色,可以是red或black。一棵紅黑樹是滿足下面紅黑性質的二叉搜尋樹 1 每乙個結點或是紅...

紅黑樹 插入

一 滿足下面幾個條件的二叉搜尋樹,稱為紅黑樹 1.任何乙個節點都被著色 紅色或是黑色。2.根節點是黑色的。3.所有的nil節點都看成黑色 nil節點是就是乙個假想的或是無實在意義的節點,所有應該指向null的指標,都看成指向了nil節點。包括葉節點的子節點指標或是根節點的父指標 4.如果乙個節點是紅...