<style> * { letter-spacing: 0.02em; text-align:justify } p.part { text-indent: 2em; line-height: 2em; } .keyword { color: red; } .variable { color: red; border-radius: 10%; margin: 1px; padding: 1px 5px; background: #f5f5f5; font-weight: 480; } .not-indent{ text-indent: 0; line-height: 0; } p .small { text-indent: 0em; line-height: 0em; } </style> # **Red Black Tree** ## **Introduction** 隨著Binary Search Tree節點成長BST容易產生偏重一邊形成skewed tree,使得資料搜尋時間複雜度變為$O(n)$。為了解決上述問題,現今已有不同的資料結構維持BST平衡,如:AVL Tree、Red Black Tree擁有各自獨特的規則使得BST不會產生歪斜情況發生,而本篇將著重介紹台綜大111考古題出現的Red Black Tree ## **AVL Tree Review** --- ### Case1-LL ![image](https://hackmd.io/_uploads/r1ALTf0jT.png) ### Case2-RR ![image](https://hackmd.io/_uploads/HJEvTG0i6.png) ### Case3-RL ![image](https://hackmd.io/_uploads/BJKDpz0sp.png) ### Case4-LR ![image](https://hackmd.io/_uploads/Byx_TGCjT.png) ## **Red Black Tree** ### **Rule** --- ![image](https://hackmd.io/_uploads/HJid6fAsp.png) 1. 每個節點只有兩種顏色==紅==或==黑== 2. 根節點(root)和外部節點(external node or NIL)一定是==黑色== 3. 所有從根節點(Root)至外部節點的路徑(Path)所包含的==黑色==節點數量==相同== 4. ==不存在==兩個==紅色節點==彼此==相連== $\equiv$ ==紅色節點==必有兩個==黑色子節點== Red black Tree為各個節點上色,並增加了NIL(Null)節點的概念,其代表著(Leaf node),目的是為了維持rule成立,為了方便通常省略表示。 ### **Rotation** --- ![image](https://hackmd.io/_uploads/SybKafAia.png) ### **Insert** --- 1. 將資料新增至原本的Binary search tree 2. 將==新節點==塗成==紅色== 3. 查看新節點是否違反rule 4,若違反則進行調整 ### **Case 1 - Uncle節點是紅色 (LLr , RRr , LRr , RLr)** ![image](https://hackmd.io/_uploads/SJFYpGAj6.png) > current node (new node)為z、parent為pz、grandparent為gz、uncle為y 1. 將黑色傳給grandparent下一Level (parent and uncle)自身改為紅色 2. 如果grandparent是root節點,強制改為黑色 3. 將z pointer指向grandparent使其成為下一個修正觀察點 #### example - ***LLr*** ![image](https://hackmd.io/_uploads/B1JcaMRip.png) ### **Case 2 - Uncle節點是黑色 (LLb , RRb , LRb , RLb)** ![image](https://hackmd.io/_uploads/Sy8c6MRoa.png) > 根據LL、RR、LR、RL Case進行旋轉修正 > Case 2實際上還要區分另外一個Case (實作上需要),但紙筆測驗只記一個Case處理比較快 #### example - ***LRb*** (不含指標操作僅代表數值) ![image](https://hackmd.io/_uploads/SkqoafCjp.png) #### example - Case 1 ~ Case 2 (含指標操作) ![image](https://hackmd.io/_uploads/BJg3TGAs6.png) ### **Delete** --- Red Black Tree刪除如同BST一樣,只是多了顏色的限制 > Review BST delete > 1. 如果刪除節點只有左子節點,則左子節點取代刪除節點 > 2. 如果刪除節點只有右子節點,則右子節點取代刪除節點 > 3. 如果刪除節點有兩個子節點,則可以選擇左子樹最大值或者右子樹最小值取代 如果刪除是==黑色節點==,則RBT完成初步刪除後要進行調整,$x$代表取代上來的節點(current node),而$w$代表兄弟節點 > x represent current node and w represent x's sibling ### **Case 1 - sibling $w$ 是紅色** 1. 將sibling $w$ 改成==黑色== 2. 將$x$的parent 改成==紅色== 3. $x$'s parent node 向==左旋轉== 4. $w$指向$x$'s parent node右節點 5. 進到Case 2 or 3 or 4 ![image](https://hackmd.io/_uploads/B1K3aGCjp.png) ### **Case 2 - sibling $w$ 是黑色,且$w$兩個子節點也是黑色** ![image](https://hackmd.io/_uploads/SJCnpfCs6.png) 1. 將sibling $w$改成==紅色== 2. $x$指向$x$'s parent node重新判斷Case > 下圖B為任意顏色,以淺紅色表示,Case 2處理完要繼續循環處理B直到沒有違反規則 ### **Case 3 - sibling $w$ 是黑色,且$w$左子節點是紅色、右子節點是黑色** 1. $w$左子節點改為==黑色== 2. $w$自己改為==紅色== 3. $w$進行==右旋(Right Rotation)== 4. $w$指向$x$'s parent右子節點 5. 進到Case 4 ![image](https://hackmd.io/_uploads/rJ7TTfRj6.png) ### **Case 4 - sibling $w$ 是黑色,且$w$右子節點是紅色** 1. $w$改為==parent node顏色== 2. parent nodee改為==黑色== 3. $w$右子節點顏色改為==黑色== 4. parent nodee進行==左旋(Left Rotation)== 5. $x$指向Root,並將Root改為==黑色== ![image](https://hackmd.io/_uploads/HJY66fRjp.png) ### **Flow Chart** --- ![image](https://hackmd.io/_uploads/rJC6pGRia.png) > Reference: Red Black Tree: Delete(刪除資料)與Fixup(修正) ## 考古題 --- ### 111 台綜大 A06 ![image](https://hackmd.io/_uploads/SkLA6GCja.png) > Insert 10 ![image](https://hackmd.io/_uploads/Hkq8yXRsT.png) > Insert 100 ![image](https://hackmd.io/_uploads/ByewJQAj6.png) > Insert 30 ![image](https://hackmd.io/_uploads/HyuP1XAsT.png) > Insert 80 ![image](https://hackmd.io/_uploads/BJkOyXCs6.png) > Insert 50 ![image](https://hackmd.io/_uploads/S1Su1mRsT.png) > Remove 10 ![image](https://hackmd.io/_uploads/ryRdkXCjp.png) > Insert 60 ![image](https://hackmd.io/_uploads/H1KYy7Ajp.png) > Insert 70 ![image](https://hackmd.io/_uploads/BJJqymRsa.png) > Insert 40 ![image](https://hackmd.io/_uploads/Skpc1QCop.png) > Remove 80 (找左子樹最大取代,Root改成黑色) ![image](https://hackmd.io/_uploads/SkGi1XRoa.png) > 詳解 ![image](https://hackmd.io/_uploads/BJtjJX0sp.png) ![image](https://hackmd.io/_uploads/rkRiyQAsa.png) ![image](https://hackmd.io/_uploads/ByUn1X0s6.png) ## Reference [1] [Red Black Tree: Delete(刪除資料)與Fixup(修正)](https://alrightchiu.github.io/SecondRound/red-black-tree-deleteshan-chu-zi-liao-yu-fixupxiu-zheng.html) [2] Introduction to Algorithm (Fourth Edition), Cambridge, Massachusetts London, England [3] [Red/Black Tree Visualization](https://www.cs.usfca.edu/~galles/visualization/RedBlack.html) >[name=Sky] ###### tags: `資料結構`