ahoj, delam projekt do skoly, je to bvs, mam hotovou inicializaci, pridavani, vyhledavani a odstraneni uzlu, ktere maji zadne nebo jednoho potomka.
Ted jsem se ale zasekl na odstranovani uzlu ktere maji dva potomky. Jak chci aby to funguvalo, tak mam pomocnou fci ReplaceByRightmost(), ktera najde nejpravejsi prvek v levem podstromu uzlu, ktery chci smazat, prepise hodnotu mazaneho uzlu tou, kterou nasel jako nejpravejsi a odstrani tento nejpravejsi, ukazatel na zacatek podstromu a na prepisovany prvek ji zadam.
fce vypada takto:
void ReplaceByRightmost (tBSTNodePtr PtrReplaced, tBSTNodePtr *RootPtr)
{
if((*RootPtr)->RPtr == NULL) /*aktualni RootPtr uz nema praveho syna, je teda nejpravejsi, chci jeho hodnotu vzit a prepsat ji do PtrReplaced*/
{
PtrReplaced->Key = (*RootPtr)->Key; //prepsani klice
PtrReplaced->BSTNodeCont = (*RootPtr)->BSTNodeCont; //prepsani hodnoty
tBSTNodePtr pom2 = (*RootPtr)->LPtr; //pom2 uchovava leveho syna mazaneho prvku, pravy je NULL
prev->RPtr = pom2; /*prev ukazuje na predchozi prvek vuci *RootPtr, takze spojim leveho syna *RootPtr s otcem *RootPtr*/
free(*RootPtr);
*RootPtr = pom2; /*a jako novy *RootPtr nastavim leveho syna *RootPtr, kdyz udelam *RootPtr = prev => sigsegv*/
}
else
{
prev = *RootPtr; /*do globalni promenne ukladam aktualni hodnotu uzlu a zanorim se, takze znam i jeho predchudce*/
ReplaceByRightmost(PtrReplaced, &(*RootPtr)->RPtr); //a hledam v prave casti
}
}
jeste pripojim obrazek, toto je pocateci stav
+-[Z,10]
|
+-[Y,10]
|
+-[X,10]
|
+-[S,10]
| |
| +-[R,10]
| |
| +-[Q,10]
| |
| +-[P,10]
|
+-[O,16]
|
+-[N,14]
| |
| +-[M,13]
|
+-[L,12]
| |
| | +-[K,11]
| | |
| +-[J,10]
| |
| +-[I,9]
|
+-[H,8]
|
| +-[G,7]
| |
| +-[F,6]
| | |
| | +-[E,5]
| |
+-[D,4]
|
| +-[C,3]
| |
+-[B,2]
|
+-[A,1]
odstranovani listu jako [A,1] funguje, funguje i odstraneni [R,10], ve skriptu se odstranuji postupne A1, R10, X10, L12, H8, K11, D4, S10 a muj program vyhodi nasledujici:
+-[Z,10]
|
+-[Y,10]
|
+-[Q,10]
| |
| +-[P,10]
|
+-[O,16]
|
+-[N,14]
| |
| +-[M,13]
|
+-[J,10]
| |
| +-[I,9]
|
+-[G,7]
|
| +-[I,9]
| |
| +-[F,6]
| | |
| | +-[E,5]
| |
+-[C,3]
|
| +-[P,10]
| |
+-[B,2]
a ocekavany vystup je bez I9 za F6 a bez P10 za B2, obe jsou zdvojene v pravem ukazateli, takze asi bude nekde chyba v praci s nim, ale uz nevim kde, mate nekdo tuseni?
jeste dodam ze kdyz pridavam prvky, tak vzdycky jsou oba jejich LPtr a RPtr NULL, az pokud pridavam mensi/vesti tak se meni
a toto je odstraneni uzlu, ktery ma jen praveho syna, pro leveho syna je to analogicke, follow me je obdoba vyse zmineneho prev
else if((*RootPtr)->LPtr == NULL)
{
tBSTNodePtr hilfe = (*RootPtr)->RPtr;
if(followme->LPtr->Key == K)
{
free(followme->LPtr);
followme->LPtr = hilfe;
}
if(followme->RPtr->Key == K)
{
free(followme->RPtr);
followme->RPtr = hilfe;
}
}
moc byste me potesili s nejakym napadem, jak uz pomalu lamu klavesnicu :D