紅黑樹的插入和刪除

2021-08-04 10:35:22 字數 2292 閱讀 4347

上一章講述了紅黑樹得相關性質,我們了解到紅黑樹確實是平衡二叉樹,在時間複雜度為o(lg(n)),比二叉搜尋樹效能更好,效能變好的前提是演算法更加複雜了,下面講述紅黑樹的插入和刪除操作,希望對大家有所幫助。

紅黑樹的插入操作和二叉搜尋樹大致相同,不同點是在將節點x插入紅黑樹後,此時的紅黑樹可能會違反紅黑樹的相關性質,我們需要對其進行調整,調整的方法有兩種:變色和旋轉。下面著重講述一下旋轉操作。

旋轉分為左旋和右旋,具體示意圖如下:

旋轉變換不會改變紅黑樹的中序遍歷。

由上圖中旋轉變換的原理,可以寫出旋轉變換的偽**:

left-rotate(t,x)

y=x.right

x.right=y.left

if y.left !=t.nil

y.left.p=x

y.p=x.p

if(x.p==t.nil)

t.root=y

elseif x==x.p.left

x.p.left=y

else

x.p.right=y

y.left=x;

x.p=y

旋轉變換c**:

void left_rotate(tree_node *x)                   //紅黑樹的左旋轉

if(x->parent->left==x)

else

y->parent=x->parent;

y->left=x;

x->parent=y;

}

這裡我們需要注意一點:當紅色節點為單支節點時,該紅色節點一定為為葉子節點。

在進行插入操作時,我們需要將插入節點的顏色賦成紅色,因為紅色節點插入後不會破壞紅黑樹性質5,但是仍然會破壞性質2或者性質4,但是僅僅出現一條性質的破壞。如果插入黑色節點,則破壞的性質位置

如下三種情況是不可能出現的:

由紅黑樹的第五條性質可以知道,任意節點x的子分支結構都具有相同的黑高,如果是上述三種情況,不可能滿足該性質。

綜上所述,插入操作可以分為如下三種情況:

情況1:如果插入節點的父節點為黑色,則直接插入即可,不會影響紅黑樹的性質。

情況2:如果插入節點的父節點為紅色,叔節點為紅色時

情況3:如果插入節點的父節點為紅色,叔節點為黑色,且待刪除節點為父節點的有孩子

這一步是為了將情況3變成情況4,再利用情況4的解決方法解決該問題

由此紅黑樹插入操作就結束了。

c**如下:

void rb_insert(tree_node *x,tree_node *z)		//插入紅黑樹的乙個節點

else

}if(y->data>z->data) //判斷z為左節點還是右節點

else

z->parent=y;

z->left=null;

z->right=null;

rb_fix(z);

}void rb_fix(tree_node *z) //重新著色

else if(z->parent->right==z) //情況2,叔節點為黑色,且插入節點為父節點的右孩子

else //情況3,叔節點為黑色,且插入節點為父節點的左孩子

}else //判斷父節點是否是祖父節點的左孩子

else if(z->parent->left==z)

else

} }}

刪除操作演算法導論上寫的始終感覺有問題,以後看懂了再講吧。

關於紅黑樹的插入和刪除

定義 紅黑樹是一棵二叉搜尋樹。它在每個結點每個結點上新增乙個儲存位來表示顏色,可以是紅色或者黑色。通過對任何一條從根到葉子結點的簡單路徑上各個結點的顏色進行約束。紅黑樹保證確保沒有一條路徑會比其他路徑長出兩倍,因而近似是平衡的。性質 1 每個結點或者是紅色或者是黑色 2 根結點是黑色的 3 每個葉子...

理解紅黑樹的節點插入和刪除

每個結點為紅色或者黑色 根結點為黑色 每個葉結點為黑色 如果乙個結點為紅色,則它的兩個子結點為黑色 對每個結點,從該結點到其後代葉子節點的簡單路徑上,均包含相同數目的黑色結點 這裡的葉結點不是指使用者在樹最底層插入的新結點點,而是插入新結點後,新結點的兩個為 nil 的左右孩子 紅黑樹的這 5 個性...

紅黑樹(插入)

紅黑樹的插入操作相對刪除操作比較簡單。紅黑樹要滿足 任一節點至null的任何路徑,所含黑節點數必須相同。所以,為了滿足此性質,插入節點應該為紅色。如果插入節點的父親為黑色,則不需要進行調整,若為紅色,有三種情況需要討論。1.父節點為紅色,叔節點為紅色 對於這種情況,同時改變父 叔節點顏色為黑色,並將...