在將紅黑樹中某個節點刪除時,分幾個步驟,首先找到該節點的位置,然後刪除該節點,最後調整紅黑樹。
本文**還存在乙個問題沒有解決,當連續刪除到第3個節點時會出現問題,現在暫時還沒找出問題,以後有空慢慢研究。
1、找出要刪除的節點
tree rb_delete_find(tree r, int d) // find the node that need deleted
if(x == null)
else
}
2、刪除節點
在找到要刪除的節點後,根據不同的情形將節點刪除。**如下:
tree rb_delete(tree r, node *z)
} else if(z->right == null)
else //左右孩子都不為空
r = rb_delete_node(r, z, y);
y->left = z->left;
y->left->p = y;
y->color = z->color;
if(null == x)
}// printf("root->key: %d \tx->key: %d\n", r->key, x->key);
// printf("root->left: %d \troot->right: %d\n", r->left->key, r->right->key);
/**在刪除或移動黑色節點時,需要將他的黑色下推給他的孩子節點。若孩子節點為空,
這時將無法將黑色下推。若黑色向上推則會導致黑高的不相等。
在此通過建立臨時節點,將其作為葉子節點。葉子節點的顏色為黑色,值為-1.
**/
//printf("------------r.key = %d x.key = %d\n",r->key, x->key);
//y_original_color儲存了移動或刪除的節點的顏色,當移動或刪除的節點為紅色時,紅黑樹的性質沒有被破壞,
//而當移動或刪除的節點為黑色時,紅黑樹的性質被破壞了,這是就需要對其進行調整。
if(y_original_color == 1) //1:黑色, 0:紅色
return r;
}
3、紅黑樹的調整
調整**如下:
tree rb_delete_fixup(tree r, node *z)
//提取x和w的乙個黑色, 上移到x的父節點。從w提出乙個黑色後其變成了紅色,x還剩乙個黑色
if((w->left==null ||w->left->color==1) && (w->right==null || w->right->color==1)) //case 2: w->color=1 && w.left=1 && w.right=1
else
w->color = x->p->color; //case 4: w->color=1 && w.right=0
x->p->color = 1;
w->right->color = 1;
r = left_rotate(r, x->p);
x = r;
}} else //x is right child
if((w->left==null || w->left->color==1) && (w->right==null || w->right->color==1)) //case 2
else
//case 4
w->color = x->p->color;
w->left->color = 1;
x->p->color = 1;
r = right_rotate(r, x->p);
x = r;
}} }
x->color = 1;
return r;
}
在以上的過程中還用到了以下函式,
首先是刪除節點函式,其**如下:
/**
** 刪除節點x,使用y來代替x節點
**/tree rb_delete_node(tree r, node *x, node *y)
else if(x == x->p->left)
else
x->p->right = y;
if(y != null)
y->p = x->p;
return r;
}
其次是查詢後繼節點的函式,**如下:
//查詢節點z的後繼節點
node *tree_minimum(node *z)
其他的如節點的資料結構,樹的左旋和右旋的具體實現函式,見紅黑樹的插入那篇文章。
紅黑樹 刪除
分類 演算法筆記 2011 09 07 21 49 318人閱讀收藏 舉報 一 紅黑樹的節點刪除 從紅黑樹上刪除乙個節點,可以先用普通二叉搜尋樹的方法,將節點從紅黑樹上刪除掉,然後再將被破壞的紅黑性質進行恢復。我們回憶一下普通二叉樹的節點刪除方法 z指向需要刪除的節點,y指向實質結構上被刪除的結點,...
紅黑樹(刪除)
相對於紅黑樹插入操作,刪除操作複雜的多。第一 先看最簡單情況,即刪除紅色節點。刪除紅色節點,不影響紅黑樹平衡性質,如圖 只需要刪除紅色節點,不需要進行調整,因為不影響紅黑樹的性質。黑色節點沒有增多也沒有減少。注意 以下幾種單支情況在平衡的紅黑樹中不可能出現。因為上述的情況,紅黑樹處於不平衡狀態。破壞...
紅黑樹刪除
相對於紅黑樹插入 操作,刪除操作複雜的多。第一 先看最簡單情況,即刪除紅色節點。刪除紅色節點,不影響紅黑樹平衡性質,如圖 只需要刪除紅色節點,不需要進行調整,因為不影響紅黑樹的性質。黑色節點沒有增多也沒有減少。注意 以下幾種單支情況在平衡的紅黑樹中不可能出現。因為上述的情況,紅黑樹處於不平衡狀態。破...