/* Desaloca a memoria alocada para a arvore, percorrendo os ramos recursivamente */
no_p libera_arvore(no_p atual) {
    if (atual != NULL) {
        libera_arvore(atual->ramo[NAO]);
        libera_arvore(atual->ramo[SIM]);
        free(atual);
    }
    return NULL;
}
void libera_arvore(tipo_arvore * arvore){
	if (arvore->esq != NULL){
		libera_arvore(arvore->esq);
	}
	if (arvore->dir != NULL){
		libera_arvore(arvore->dir);
	}
	libera_simbolo(arvore->simbolo);
	free(arvore);
}
void remove_tabela_simbolos(tipo_floresta * floresta){
	if (floresta->ultimo != NULL){
		tipo_cel * aux = floresta->ultimo;
		floresta->ultimo = aux->ant;
		if (aux->arvore != NULL){
			libera_arvore(aux->arvore);
		}
		aux->ant = NULL;
		aux->prox = NULL;
		
		free(aux);
		
		remove_tabela_simbolos(floresta);
	} else{
		floresta->primeiro = NULL;
		free(floresta);
	}
}
void remove_nivel(tipo_floresta * floresta){
	if (floresta->primeiro == NULL || floresta->ultimo == NULL){
		fprintf(stderr, "\nFloresta vazia, não é possível remover nível\n");
		exit(1);
	}
	
	tipo_cel * aux = floresta->ultimo;
	floresta->ultimo = aux->ant;
	
	if (floresta->ultimo == NULL){
		floresta->primeiro = NULL;
	} else{
		floresta->ultimo->prox = NULL;
	}
	
	if (aux->arvore != NULL){
		libera_arvore(aux->arvore);
	}
	
	free(aux);
}