Exemplo n.º 1
0
Arquivo: abb.c Projeto: fonse451/abb
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;
}
Exemplo n.º 2
0
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);
}