No* removerNo( No *no, int valor ) {

    No* temp;

    if ( valor == no->valor ) {

        // o nó não tem filhos
        if ( no->esquerda == no->direita ) {

            free( no );
            return NULL;

        // o nó a ser removido não tem filho à esquerda
        } else if ( no->esquerda == NULL ) {

            temp = no->direita;
            free( no );
            return temp;

        // o nó a ser removido não tem filho à direita
        } else if ( no->direita == NULL ) {

            temp = no->esquerda;
            free( no );
            return temp;

        // o nó a ser removido tem filhos em ambos os lados
        } else {

            No *aux = no->direita;
            temp = no->direita;

            while ( temp->esquerda != NULL ) {
                temp = temp->esquerda;
            }

            temp->esquerda = no->esquerda;
            free( no );

            return aux;

        }

    } else if ( valor < no->valor ) {
        no->esquerda = removerNo( no->esquerda, valor );
    } else {
        no->direita = removerNo( no->direita, valor );
    }

    return no;

}
//Escalona cada processo de acordo com o quantum do processador
//e o quantum solicitado pelos processos
void escalonarProcessos(TNo **inicioDaFila, int quantum)
{
    TNo *aux = (*inicioDaFila);
    int t=0, tempoDeProcessamento;

    while(aux) //enquanto houverem processos
    {
        tempoDeProcessamento = quantum; //tempo que um processo vai ter de processador

        if(aux->instanteDeEntrada < 0)  //se o instante de entrada for inválido, ou seja, o processo ainda não usou o processador,
            aux->instanteDeEntrada = t; //insere o instante em que o processo entrou no processador pela primeira vez

        while(tempoDeProcessamento && aux->q) //ou o processo usa todo o seu tempo ou já pode ser encerrado
        {
            aux->q--;
            tempoDeProcessamento--;
            t++; //incrementa o tempo de uso total do processador
        }

        if(!(aux->q)) //se o processo atual já foi encerrado
        {
            printf("%s, iniciou no quantum %i e foi finalizado no quantum %i\n", aux->id, aux->instanteDeEntrada, t-1);
            aux = removerNo(inicioDaFila, aux); //remove ele da fila
        }
        else
            aux = aux->prox; //chama o próximo processo da lista
    }
}
bool remover( ArvoreBinariaBusca *arvore, int valor ) {

    /*
     * Algoritmo iterativo.
     * Não estudaremos! É um pouco complicado...
     */


    /*
     * Algoritmo recursivo.
     */
    bool achou = contemNo( arvore->raiz, valor );

    if ( achou ) {
        arvore->raiz = removerNo( arvore->raiz, valor );
    }

    return achou;

}