紅黑樹刪除的實現

2021-06-26 20:21:28 字數 2431 閱讀 8802

在將紅黑樹中某個節點刪除時,分幾個步驟,首先找到該節點的位置,然後刪除該節點,最後調整紅黑樹。

本文**還存在乙個問題沒有解決,當連續刪除到第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指向實質結構上被刪除的結點,...

紅黑樹(刪除)

相對於紅黑樹插入操作,刪除操作複雜的多。第一 先看最簡單情況,即刪除紅色節點。刪除紅色節點,不影響紅黑樹平衡性質,如圖 只需要刪除紅色節點,不需要進行調整,因為不影響紅黑樹的性質。黑色節點沒有增多也沒有減少。注意 以下幾種單支情況在平衡的紅黑樹中不可能出現。因為上述的情況,紅黑樹處於不平衡狀態。破壞...

紅黑樹刪除

相對於紅黑樹插入 操作,刪除操作複雜的多。第一 先看最簡單情況,即刪除紅色節點。刪除紅色節點,不影響紅黑樹平衡性質,如圖 只需要刪除紅色節點,不需要進行調整,因為不影響紅黑樹的性質。黑色節點沒有增多也沒有減少。注意 以下幾種單支情況在平衡的紅黑樹中不可能出現。因為上述的情況,紅黑樹處於不平衡狀態。破...