Witam mam problem z usuwaniem elementu z drzewa BST po usunięciu elementu i próbie wyświetlenia drzewa wywala mi błąd "Program przestał działać" i nie wiem dlaczego mógłby ktoś pomóc?
class BST{
public:
int wartosc;
BST *rodzic;
BST *lewy;
BST *prawy;
BST(int x);
};
BST::BST(int x)
{
wartosc=x;
lewy=NULL;
prawy=NULL;
}
BST * NajwiekszyKluczWPoddrzewie(BST * korzen)
{
BST * x = korzen;
while(x->prawy) x = x->prawy;
return x;
}
BST * Poprzednik(BST * x)
{
if(x->lewy)
return NajwiekszyKluczWPoddrzewie(x->lewy);
BST * y;
do
{
y = x;
x = x->rodzic;
} while(x && (x->prawy != y));
return x;
}
BST* Znajdz(BST *korzen, int x)
{
while(korzen)
{
if(korzen->wartosc==x)
{
return korzen;
}
else if(korzen->wartosc<x)
{
korzen=korzen->prawy;
}
else
{
korzen=korzen->lewy;
}
}
}
void UsunelementDrzewaBST(BST *&korzen, int k)
{
BST* usun = Znajdz(korzen,k);
if (usun)
{
if ((usun->lewy) && (usun->prawy))
{
BST* poprzedni = Poprzednik(usun);
usun->wartosc=poprzedni->wartosc;
if (poprzedni->rodzic->lewy == poprzedni)
poprzedni->rodzic->lewy=poprzedni->lewy;
else
poprzedni->rodzic->prawy=poprzedni->lewy;
delete poprzedni;
}
else
{
BST* poddrzewo = usun->lewy ? usun->lewy : usun->prawy;
if (usun->rodzic)
{
if (usun->rodzic->lewy == usun)
usun->rodzic->lewy = poddrzewo;
else
usun->rodzic->prawy = poddrzewo;
if (poddrzewo)
poddrzewo->rodzic = usun->rodzic;
}
else
{
poddrzewo->rodzic=NULL;
korzen=poddrzewo;
}
delete usun;
}
}
}