ELIMINAZIONE ALBERO void Delete(abr *p, tipobaseABR x){ abr tmp; if(!EmptyABR(*p)){ if(!Confronta((*p)->info, x)){ tmp = *p; if(EmptyABR((*p)->leftchild)){ *p = (*p)->rightchild; free(tmp); }else if(EmptyABR((*p)->rightchild)){ *p = (*p)->leftchild; free(tmp); }else{ *p = DelMin(&(*p)->rightchild); (*p)->leftchild = (temp)->leftchild; (*p)->rightchild = (temp)->rightchild; free(tmp); } }else if(Confronta((*p)->info, x) > 0) Delete(&(*p)->leftchild); else Delete(&(*p)->rightchild); } }
ELIMINAZIONE FOGLIA O ELEMENTO CON UN SOLO FIGLIO (rightchild NULL)
*p CD00
FF00
tmp
CD00
FFOO NULL
FFOO
NULL NULL
ELIMINAZIONE ELEMENTO GENERICO AVENTE DUE FIGLI
30 *p HH00
UU00
tmp
HH00
16 AB00
FF00
28
14
*p UU00 ZK00 RICERCA DEL MINIMO DEI FIGLI PIU GRANDI DEL SOTTOALBERO
UU00
13
15
29
17
void DelMin(abr *p){
abr pmin; if((*p)->leftchild == ALBEROVUOTO){ pmin = *p; *p = (*p)->rightchild; return (pmin); }else return (DelMin(&(*p)->leftchild));
NULL ZK00 FF00AB00
ZK00
20 19
21 }