早鳥有福利!IGN滿分遊戲《極限競速:地平線5》全面上線
為什麼要學紅黑樹
紅黑樹的起源,自然是二叉查詢樹了,這種樹結構從根節點開始,左子節點小於它,右子節點大於它。每個節點都符合這個特性,所以易於查詢,是一種很好的資料結構。但是它有一個問題,就是容易偏向某一側,這樣就像一個連結串列結構了,失去了樹結構的優點,查詢時間會變壞。紅黑樹就是一種平衡樹,它可以保證二叉樹基本符合矮矮胖胖的結構,但是理解紅黑樹之前,必須先了解另一種樹,叫2-3樹,紅黑樹背後的邏輯就是它。
性質
紅黑樹必須要滿足這些性質
其中性質五可以圈出一個子樹來驗證:例如F到它子樹的所有葉子節點都為2個黑節點
2-3樹
- 看了筆記中的2,3樹
- 整體的插入邏輯就是, 如果能插就插, 插不了就往上丟擲
- 有點像是b樹, 它往上分裂的這樣一個邏輯
- 是的, 2-3樹是b樹的特例,b樹就是定義每個節點裡面的元素最多不超過多少個,超過就會分裂出父節點
左旋
左旋:以某個結點作為支點(旋轉結點),其右子結點變為旋轉結點的父結點,右子結點的左子結點變為旋轉結點的右子結點,左子結點保持不變。
對p進行左旋右旋(是一個動作),動圖,左旋往左走(after),右旋往右走(before)
- 這樣理解會好一些, 將新旋轉點的左子樹移到舊旋轉點的右子樹位置, 反向新舊的連線, 新替換舊的位置
- 這裡老師的gif更好
右旋
右旋:以某個結點作為支點(旋轉結點),其左子結點變為旋轉結點的父結點,左子結點的右子結點變為旋轉結點的左子結點,右子結點保持不變
紅黑樹的查詢
與二叉樹查詢一樣,因為也是小的放左邊,大的放右邊
.
插入
- 新節點必須是紅色的
- 顯而易見的, 之前的性質5是能夠保證的, 而現在的話, 如果是黑色的, 那麼性質5必破壞
- 插入紅色不過可能會破壞性質4, 不能有兩個紅色節點相連, 需要處理
- 也就是說插入黑色節點一定會破壞紅黑樹的性質,但是插入紅色只是有可能會破壞
在插入節點後,只要包含插入節點的子樹是符合紅黑樹的,那麼加上父節點的樹也是紅黑樹
插入的情景
-
情景二
-
然後當前節點變為爺爺了,爺爺是紅色,你可以理解為是插入節點,接下來就會對爺爺的父節點,叔叔,爺爺的爺爺進行變色,由於根節點一定是黑色,那麼變色到最後一定是可行的
-
LL雙紅
-
LR雙紅
插入總結
4種大的情形, 進行操作
-
空樹: 直接插入, 作為黑色節點
-
插入的key已經存在, 替換就ok
-
插入節點父親是黑色的: 直接紅色插入
-
插入節點父親是紅色 (紅紅情況出現)
-
叔叔是紅
- 父親和叔叔改黑, 爺爺改紅, 問題遞迴丟擲, 看是否有紅紅情況, 沒有則已經平衡
-
叔叔是黑, 或者沒有叔叔
-
LL雙紅: 父親改為黑, 爺爺改紅, 爺爺右旋 (LL意為, 父是爺的左, 子是父的左) (改色, 旋轉)
-
LR雙紅: 父親左旋, 則變為LL雙紅形式, 交給LL雙紅處理 (旋轉)
-
RR雙紅: 父親改為黑, 爺爺改紅, 爺爺左旋 (改色旋轉)
-
RL雙紅: 父親右旋, 則變為RR雙紅形式, 交給RR雙紅處理 (旋轉)
-
-
可以看到, 最終終結的地方有, LL雙紅, RR雙紅
搭配上面的筆記食用哦
綜合題:
刪除總結
-
刪除的難度比插入多一大截
-
好像也沒必要看吧, 直接將邏輯刪除就可以了把, 沒必要這麼麻煩