紅黑樹原理

紅黑樹(B-R Tree):全稱 Red-Black Tree,是一種特殊的二叉查找樹。紅黑樹的上每個節點都有存儲位表示節點的顏色,可以是紅(Red)或 黑(Black)

紅黑樹的特性

  1. 每個節點要麼是黑色,要麼是紅色;
  2. 跟節點是黑色;
  3. 每個葉子節點(NIL)是黑色;
  4. 如果一個節點是紅色,那麼它的子節點必須是黑色
  5. 從一個節點到該節點的子孫節點的所有路徑,其包含的黑色節點的樹相同。

注意:

  1. 特性3中的子節點,是隻爲空( NIL 或是 NULL )的節點。
  2. 特性5,確保沒有一條路徑會比其他路徑長出兩倍。因而,紅黑樹是相對接近平衡的二叉樹。

紅黑樹的事例圖如下:
在這裏插入圖片描述
紅黑樹的操作

  1. 左旋
    在這裏插入圖片描述
// 前提:這裏假設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”

左旋中的“左”,意味着“被旋轉的節點將變成一個左節點”

  1. 右旋
    在這裏插入圖片描述
// 前提:這裏假設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”

右旋中的“右”,意味着“被旋轉的節點將變成一個右節點”

標準的紅黑樹事例圖:
任意一層從左到右都應該是從小到大排列【左節點小於父節點,右節點大於父節點】
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章