1. 程式人生 > 遊戲 >早鳥有福利!IGN滿分遊戲《極限競速:地平線5》全面上線

早鳥有福利!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雙紅

搭配上面的筆記食用哦

綜合題:

刪除總結