紅黑樹定義:
紅黑樹是一種自平衡二叉查找樹,紅黑樹和AVL都是BST(二叉排序樹)的平衡版本,相比於AVL的完全平衡,紅黑樹只要求局部平衡,因此當向紅黑樹插入和刪除結點時,需要調整的比AVL要少,統計性能要高於AVL樹,C++ STL中的map、set、multimap和multiset都應用了紅黑樹的變體。AVL插入結點調整見:平衡二叉樹-AVL樹(LL、RR、LR、RL旋轉)。
紅黑樹的特點:
(1)每個節點或者是黑色,或者是紅色。
(2)根節點是黑色。
(3)每個葉子節點(NIL)是黑色。 [注意:這里葉子節點,是指為空(NIL或NULL)的葉子節點!]
(4)如果一個節點是紅色的,則它的子節點必須是黑色的。
(5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。[這里指到葉子節點的路徑]
紅黑樹生成過程:
1、當插入的節點的父節點為null,則將該節點顏色置為black。
2、當插入節點的父節點顏色為black,不需要調整。
3、當插入節點的父節點為red,其叔父節點亦為紅色,則將其父親節點和叔父節點置為black,同時將祖父節點置為red,將祖父節點設置為當前新增節點,重新按照從規則1開始判斷。
4、但插入節點的父親節點為red,其叔父節點為black或null,則需要分多鍾情況考慮。
a)新增節點為父親節點右孩子同時父親節點是祖父節點的左孩子,則進行左旋,將父節點置為新節點,重新按照規則1進行判斷;
b)新增節點為父親節點左孩子,同時父親節點是租戶節點的右孩子,則進行右旋,將父節點置為新節點,重新按照規則1進行判斷;
5、不滿足上述所有條件,將父節點置為black,同時,將祖父節點置為red,進行以下兩種情況判斷。
a)如果新增節點是父親節點的左孩子,同時,父親節點是祖父孩子的左孩子,則對祖父節點進行右旋
b)其他情況,對祖父節點左旋。
示例:35 75 65 56 78 29 41 37 38
插入35:
插入75:
插入65:
插入56:
插入78:
插入29:
插入41:
插入37:
插入38:
整棵樹為:
該網站可以詳細看到紅黑樹的創建、刪除結點的過程: Red/Black Tree。
參考地址:https://www.cnblogs.com/woniu4/p/8086707.html