本文將帶你了解紅黑樹插入和刪除節點的處理過程,在這之前你應該對紅黑樹或bst有一些了解
r-b tree,全稱是red-black tree,又稱為「紅黑樹」,它一種特殊的二叉查詢樹。紅黑樹的每個節點上都有儲存位表示節點的顏色,可以是紅(red)或黑(black)。
(1)根節點是黑色。
(2)每個外部節點(null)是黑色。
(3)如果乙個節點是紅色的,則它的子節點必須是黑色的。
(4)從乙個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。
在學習之前我們來看另一種特殊的樹 ——b-樹
b-樹(英語:b-tree)是一種自平衡的樹,能夠保持資料有序。這種資料結構能夠讓查詢資料、順序訪問、插入資料及刪除的動作,都在對數時間內完成。b樹,概括來說是乙個一般化的二叉查詢樹(binary search tree),可以擁有多於2個子節點。
經過提公升變換可以將一顆紅黑色變換為b-樹
後面,我們將以b-樹為輔助講解紅黑樹的插入和刪除操作
根據以上資訊我們給出紅黑樹的部分定義
紅黑樹定義
template
<
class
_elem
>
class
_tree
~_tree
(void
)friend
class
_tree
<_elem>
::_tree_node;
};
節點定義
template
<
class
_elem
>
class
_tree
<_elem>
::_tree_nodecolor;
// 顏色
_elem value;
// 值
_mytn *lc;
// 左孩子
_mytn *rc;
// 右孩子
_mytn *parent;
// 父節點
public
:explicit
_tree_node
(_elem v =
_elem()
, color c = red, _mytn *l =
nullptr
, _mytn *r =
nullptr
, _mytn *p =
nullptr):
value
(v),
color
(c),
lc(l),rc
(r),
parent
(p)~
_tree_node()
friend
class
_tree
<_elem>
::iterator;
friend
class
_tree
<_elem>;}
;
迭代器定義
template
<
class
_elem
>
class
_tree
<_elem>
::iterator
iterator
(_myit const
& it):_p
(it._p)
friend
class
_tree
<_elem>;}
;
B樹,B 樹,紅黑樹
紅黑樹和b樹應用場景有何不同?2者都是有序資料結構,可用作資料容器。紅黑樹多用在內部排序,即全放在記憶體中的,微軟stl的map和set的內部實現就是紅黑樹。b樹多用在記憶體裡放不下,大部分資料儲存在外存上時。因為b樹層數少,因此可以確保每次操作,讀取磁碟的次數盡可能的少。在資料較小,可以完全放到記...
B樹 B 樹 B 樹 B 樹 紅黑樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...
B樹 B 樹 B 樹 B 樹 紅黑樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...