void borrar_nodo_aux(abb_t *arbol,nodo_t* nodo,nodo_t* padre){ if (es_hoja(nodo)){ if(!padre){ arbol->raiz = NULL; } else if (arbol->funcion_de_comparacion(nodo->clave,padre->clave) > 0){ padre->nodo_derecho = NULL; } else{ padre->nodo_izquierdo = NULL; } } else if(!nodo->nodo_izquierdo){ if (!padre){ arbol->raiz = nodo->nodo_derecho; } else{ swap(arbol,nodo,padre,nodo->nodo_derecho); } } else if(!nodo->nodo_derecho){ if (!padre){ arbol->raiz = nodo->nodo_izquierdo; } else{ swap(arbol,nodo,padre,nodo->nodo_izquierdo); } } else{ nodo_t* mgc = buscar_de_grande_el_mas_chico(nodo->nodo_derecho); //mgc "MAS GRANDE CHICO" if(arbol->funcion_de_comparacion(nodo->nodo_derecho->clave,mgc->clave) != 0){ nodo_t* padre_mgc = buscar_padre_de_mgc(arbol,nodo->nodo_derecho, mgc->clave); if(mgc->nodo_derecho){ padre_mgc->nodo_izquierdo = mgc->nodo_derecho; } else{ padre_mgc->nodo_izquierdo = NULL; } } swap_mgc_nodo(arbol,nodo,padre,mgc); } free(nodo->clave); free(nodo); return; }
void RedBlackTree::elimina_un_hijo(Node *n) { eliminarNodo(n); Node *hijo = es_hoja(n->derecho) ? n->izquierdo : n->derecho; reemplazar_nodo(n, hijo); if (n->color == "NEGRO") { if (hijo->color == "ROJO") hijo->color = "NEGRO"; else eliminar_caso1(hijo); } free(n); }
void elimina_un_hijo(struct node *n) { /* * Precondición: n tiene al menos un hijo no nulo. */ struct node *hijo = es_hoja(n->dcho) ? n->izdo : n->dcho; reemplazar_nodo(n, hijo); if (n->color == NEGRO) { if (hijo->color == ROJO) hijo->color = NEGRO; else eliminar_caso1(hijo); } free(n); }