紅黑樹的性質:
1.紅黑樹中的節點是黑色或者紅色;
2.根節點一定是黑色
3.終端節點是黑色
4.沒有2個紅節點互為父子關係
5.從任意節點出發到其所能到達的各個終端節點的各條路徑上黑節點數目必須完全相同
紅黑樹的建立:節點的初始顏色為紅色,共7種情況
1.空 變為黑色 結束
2.父親節點為黑 放入 結束
3.父親節點為紅
3.1叔叔節點為紅
父->黑 叔->黑 爺->紅
爺爺作為當前節點向上遍歷
3.2 叔叔節點為黑
3.2.1父親是爺爺 的左
3.2.1.1當前節點z是父親的右
父親作為當前節點z,
以當前節點z為支點左旋
3.2.1.2 當前節點z是父節點的左
父->黑 爺->紅
以爺爺為支點右旋
結束3.2.2父親是爺爺的右
3.2.2.1當前節點z是父親的左
父親作為當前節點z
以z為父的右旋
3.2.2.2當前節點z是父親的右
父->黑 爺->紅
以爺爺為支點左旋
舉個例子
**:將根設為了全域性變數,所有函式都可以直接改變他的值;左旋和右旋,在原來的基礎上改動了一點點,變根的情況,更新rbt。
typedef structnode1
rbt;
enum
color ;
rbt* rbt =null;
void rightspin(rbt**pptree)
else
rbt =ptmp;
ptree->pfather =ptmp;
}void leftspin(rbt**pptree)
else
rbt =ptmp;
ptree->pfather =ptmp;
}rbt* find(rbt* prbt,int
num)
else
}}rbt* getuncle(rbt*ptmp)
void insertnode(rbt* prbt, int
num)
if(pfather->val >num)
pfather->pleft =ptmp;
else
pfather->pright =ptmp;
ptmp->pfather =pfather;
//父節點為黑色
if(pfather->color ==black)
rbt* pgrandfather =null;
rbt* puncle =null;
//父節點為紅色
while(pfather->color ==red)
continue
; }
//沒有叔叔或叔叔是黑色
if(puncle == null || puncle->color ==black)
//當前節點為父左
if(ptmp == pfather->pleft)
}if(pfather == pgrandfather->pright)
if(ptmp == pfather->pright)}}
}rbt->color =black;
}
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹筆記 紅黑樹的插入操作
紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...