因為學習hashmap的時候,遇到了紅黑樹,故而複習哈,
想深度學習的請轉到下面鏈結,作者**並茂的詳細講解了哈,分析的很清楚,覺得好的不忘給別人手動比心。
30張圖帶你徹底理解紅黑樹
因為從這裡開始,是自己的學習筆記,從上面提到的文章中學習總結的,主要是為了給自己看,記錄哈,容易忘記,純概念,可能比較苦澀,見諒
首先說一下,紅黑樹的規則,
1,根節點必須是黑色的
2,節點只有兩種顏色,黑色和紅色
3,紅色節點的兩個子節點一定都是黑色的
4,每乙個節點通往葉子節點的路徑上的黑色節點的個數相同
5,每個葉子節點都是黑色的
紅黑樹插入節點,8種場景
情景一,紅黑樹為空
直接把插入節點作為根節點
情景二,插入節點的key已經存在
直接替換值
情景三,插入節點的父節點是黑色的
直接插入
情景四,插入節點的父節點是紅色的
1,叔叔節點存在,且為紅色
祖父節點變紅色,父親,叔叔節點轉黑色。
2,叔叔節點為空或者為黑色,且父親節點是祖父節點的左子節點
<1>插入節點是父節點的左子節點
祖父節點變為紅色,父節點變為黑色,右旋祖父節點
<2>插入節點是父親節點的右子節點,
父親節點左旋,父親節點轉黑色,祖父節點轉紅色,右旋祖父節點
3,叔叔節點為空或為黑色,且父親節點是祖父節點的右子節點
<1>插入節點是父親節點的右子節點
祖父節點變為紅色,父親節點變為黑色,左旋祖父節點
<2>插入節點是父親節點的左子節點
右旋父親節點,父親節點變為紅色,祖父節點變為黑色,左旋祖父節點
紅黑樹刪除場景,9中場景,
刪除場景,
1,沒有子節點,直接刪除
2,只有乙個子節點,用子節點代替刪除節點。
3,有兩個子節點,用後繼節點代替刪除節點(其實用前繼節點也一樣)。後繼節點就是,右子樹最左邊的葉子節點
刪除思想,在不考慮鍵值的情況下,將刪除節點,轉換為刪除替換節點。替換節點就是後繼節點。並且在最後,將刪除節點的鍵值改為替換節點的值,並將替換節點刪除,所以此處我們就需要考慮替換節點刪除時的,二叉樹平衡問題。
情景一,替換節點是紅色,
直接刪除
情景二,替換節點是黑色
2.1,替換節點是左子節點
2.1.1替換節點的兄弟節點是紅色節點
兄弟節點轉換為黑色,父親節點轉換為紅色,左旋父親節點。那麼轉到2.1.2.(3);
2.1.2替換節點的兄弟節點是黑色節點
2.1.2.(1)替換節點的兄弟節點的左子節點顏色任意,右子節點紅色
修改兄弟節點的顏色為父節點的顏色,父親節點修改為黑色,兄弟節點的右子節點修改為黑色,左旋父親節點
2.1.2.(2)替換節點的兄弟節點的左子節點是紅色,右子幾點是黑色
兄弟節點的左子節點變為黑色,兄弟節點變為紅色,兄弟節點右旋,轉到2.1.2.(1)
2.1.2.(3)替換節點的兄弟節點的左子節點是黑色,右子節點是黑色
兄弟節點變為紅色,替換節點變為父節點,繼續進行刪除規則。
當替換節點向上,定位到根節點的時候,結束,並刪除節點
2.2,替換節點是右子節點
2.2.1 替換節點的兄弟節點是紅色節點的時候,
兄弟節點變為黑色,父親節點變為紅色,父親節點右旋,轉到2.2.2.(3)
2.2.2 替換節點的兄弟節點是黑色節點的時候
2.2.2.(1) 替換節點的兄弟節點的左子節點是紅色,右子節點任意
左子節點變為父親節點的顏色,父親節點變為紅色,兄弟節點的左子節點變為黑色,右旋父親節點。
2.2.2.(2)替換節點兄弟節點的左子節點是黑色,右子節點是紅色,
兄弟節點變為紅色,右子節點變為黑色,左旋兄弟節點,轉到2.2.2.(1)
2.2.2.(3)替換節點的兄弟節點的左子節點是黑色,右子節點也是黑色,
兄弟節點轉為紅色節點,刪除節點變為父節點,繼續進行刪除規則。
紅黑樹學習筆記
二叉樹,他的定義是每個節點最多只有兩個子樹 即左子樹和右子樹,當然也可以沒有子樹 如下圖是乙個簡單的二叉樹 對於這樣的資料結構,在c語言中通常這樣來定義結構體?1 2 3 4 5 typedefstruct binary tree binarytree 二叉搜尋樹,首先他也是乙個二叉樹,與二叉樹不同...
紅黑樹學習筆記
1.每個節點不是紅色就是黑色 2.不可能有連在一起的紅色節點 3.根節點都是黑色的 root 沒有父節點的節點就是根節點,即入度為0 4.每個紅色節點的兩個子節點都是黑色,葉子節點都是黑色,出度為0,滿足了性質就可以近似的平衡了,不一定要紅黑,也可以是其他的。紅黑樹有三種旋轉方式 1.改變顏色 紅變...
紅黑樹筆記
1.紅黑樹的根是黑的 2.所有外部節點 nil 都是黑的 3.其餘節點若為紅則只能有黑孩子 紅節點的兒子和父親都是黑色的 4.外部節點到根途經的黑節點數目相等 黑深度 外部節點是一類本不存在的節點 引入是為了方便分析和實現 紅黑樹的區域性結構無非四種 總是假設插入的節點是紅色 除非是根 1.雙紅缺陷...