紅黑樹(B-R Tree):全稱 Red-Black Tree,是一種特殊的二叉查找樹。紅黑樹的上每個節點都有存儲位表示節點的顏色,可以是紅(Red)或 黑(Black)
紅黑樹的特性
- 每個節點要麼是黑色,要麼是紅色;
- 跟節點是黑色;
- 每個葉子節點(NIL)是黑色;
- 如果一個節點是紅色,那麼它的子節點必須是黑色;
- 從一個節點到該節點的子孫節點的所有路徑,其包含的黑色節點的樹相同。
注意:
- 特性3中的子節點,是隻爲空( NIL 或是 NULL )的節點。
- 特性5,確保沒有一條路徑會比其他路徑長出兩倍。因而,紅黑樹是相對接近平衡的二叉樹。
紅黑樹的事例圖如下:
紅黑樹的操作
- 左旋
// 前提:這裏假設x的右孩子爲y。下面開始正式操作
// 將 “y的左孩子” 設爲 “x的右孩子”,即 將β設爲x的右孩子
// 將 “x” 設爲 “y的左孩子的父親”,即 將β的父親設爲x
// 將 “x的父親” 設爲 “y的父親”
// 情況1:如果 “x的父親” 是空節點,則將y設爲根節點
// 情況2:如果 x是它父節點的左孩子,則將y設爲“x的父節點的左孩子”
// 情況3:(x是它父節點的右孩子) 將y設爲“x的父節點的右孩子”
// 將 “x” 設爲 “y的左孩子”
// 將 “x的父節點” 設爲 “y”
左旋中的“左”,意味着“被旋轉的節點將變成一個左節點”
- 右旋
// 前提:這裏假設y的左孩子爲x。下面開始正式操作
// 將 “x的右孩子” 設爲 “y的左孩子”,即 將β設爲y的左孩子
// 將 “y” 設爲 “x的右孩子的父親”,即 將β的父親設爲y
// 將 “y的父親” 設爲 “x的父親”
// 情況1:如果 “y的父親” 是空節點,則將x設爲根節點
// 情況2:如果 y是它父節點的右孩子,則將x設爲“y的父節點的左孩子”
// 情況3:(y是它父節點的左孩子) 將x設爲“y的父節點的左孩子”
// 將 “y” 設爲 “x的右孩子”
// 將 “y的父節點” 設爲 “x”
右旋中的“右”,意味着“被旋轉的節點將變成一個右節點”
標準的紅黑樹事例圖:
任意一層從左到右都應該是從小到大排列【左節點小於父節點,右節點大於父節點】