Witam! Walczę z usuwaniem w drzewie binarnym typu czerwono czarnego. Nie wiem gdzie popełniłem błąd w funkcji wyszukującej następnika dla usuwanego węzła. Ta funkcja zwraca mi zawsze węzeł wskazujący na nic Druga sprawa nie wiem czy poprawnie zrobiłem samą implementację drzewa, bo u mnie liscie to wartości typu NULL a nie puste węzły czyli NIL.
struct tnode /*wezel drzewa*/
{
string nazwisko, imie, adres;
long int numer_komorkowy, numer_domowy, numer_do_pracy;
int kolor; //0 czarny 1 czerowny
tnode *lewy, *prawy, *p;
///konstruktor
tnode()
{
nazwisko="";
imie="";
adres="";
lewy=NULL;
prawy=NULL;
p=NULL;
}
tnode(string n, string i, string a, long int nk, long int nd, long int ndp)
{
nazwisko=n;
imie=i;
adres=a;
numer_komorkowy=nk;
numer_domowy=nd;
numer_do_pracy=ndp;
lewy=NULL;
prawy=NULL;
p=NULL;
kolor=1;
}
};
tnode *korzen;
tnode *Tree_Succesor(tnode *x)
{
tnode *y;
if(x->prawy!=NULL) {y = TreeMin(x->prawy); return y;}
y=x->p;
while((y!=NULL)&&(x==y->prawy))
{
x=y;
y=y->p;
}
return y;
}
tnode *TreeMax(tnode *x)
{
while(x->prawy!=NULL)
x=x->prawy;
return x;
}
/*--------------------------------------------------------------------*/
tnode *TreeMin(tnode *x)
{
while(x->lewy!=NULL)
x=x->lewy;
return x;
}
void replace_node(tnode *x, tnode *y)
{
tnode *tmp=x;
x->p=y->p;
x->lewy=y->lewy;
x->prawy=y->prawy;
y->p=tmp->p;
y->lewy=tmp->lewy;
y->prawy=tmp->prawy;
delete tmp;
}
tnode *sibling(tnode *x)
{
if (cmp(x,x->p->lewy)==0)
return x->p->prawy;
else
return x->p->lewy;
}
void delete_wezel(tnode *x)
{
/*
* Precondition: n has at most one non-null child.
*/
tnode *y = Tree_Succesor(x);
if(x->prawy == NULL) y = x->lewy;
else { y = x->prawy; }
replace_node(x,y);
if (x->kolor == 0) {
if (y->kolor == 1)
y->kolor = 0;
else
delete_case1(y);
}
delete x;
}
void delete_case1(tnode *x)
{
if (x->p != NULL)
delete_case2(x);
}
void delete_case2(tnode *x)
{
tnode *y = sibling(x);
if (y->kolor == 1) {
x->p->kolor = 1;
y->kolor = 0;
if (x == x->p->lewy)
Left_Rotate(x->p);
else
Right_Rotate(x->p);
}
delete_case3(x);
}
void delete_case3(tnode *x)
{
tnode *y = sibling(x);
if ((x->p->kolor == 0) &&
(y->kolor == 0) &&
(y->lewy->kolor == 0) &&
(y->prawy->kolor == 0)) {
y->kolor = 1;
delete_case1(x->p);
} else
delete_case4(x);
}
void delete_case4(tnode *x)
{
tnode *y = sibling(x);
if ((x->p->kolor == 1) &&
(y->kolor == 0) &&
(y->lewy->kolor == 0) &&
(y->prawy->kolor == 0)) {
y->kolor = 1;
x->p->kolor = 0;
} else
delete_case5(x);
}
void delete_case5(tnode *x)
{
tnode *y = sibling(x);
if (y->kolor == 0) {
if ((x == x->p->lewy) &&
(y->prawy->kolor == 0) &&
(y->lewy->kolor == 1)) { /* this last test is trivial too due to cases 2-4. */
y->kolor = 1;
y->lewy->kolor = 0;
Right_Rotate(y);
} else if ((x == x->p->prawy) &&
(y->lewy->kolor == 0) &&
(y->prawy->kolor == 1)) {/* this last test is trivial too due to cases 2-4. */
y->kolor = 1;
y->prawy->kolor = 0;
Left_Rotate(y);
}
}
delete_case6(x);
}
void delete_case6(tnode *x)
{
tnode *y = sibling(x);
y->kolor = x->p->kolor;
x->p->kolor = 0;
if (x == x->p->lewy) {
y->prawy->kolor = 0;
Left_Rotate(x->p);
} else {
y->lewy->kolor = 0;
Right_Rotate(x->p);
}
}