public ArvoreBinaria<T> retornaArvoreEsquerda(T elemento) {

    if (estaVazia()) return null;

    if (this.elemento.compareTo(elemento) == 0) return esquerda;

    if (elemento.compareTo(this.elemento) < 0) {
      return esquerda.retornaArvoreEsquerda(elemento);
    } else {
      return direita.retornaArvoreEsquerda(elemento);
    }
  }
  public int retornaAltura() {
    if (estaVazia()) return -1;

    Integer alturaDaDireita, alturaDaEsquerda;

    alturaDaDireita = 1 + direita.retornaAltura();

    alturaDaEsquerda = 1 + esquerda.retornaAltura();

    if (alturaDaDireita >= alturaDaEsquerda) return alturaDaDireita;

    return alturaDaEsquerda;
  }
  private void rotacionarParaDireita() {

    ArvoreBuscaBinariaAVL<T> novaEsquerda, novaDireita = new ArvoreBuscaBinariaAVL<T>();

    novaEsquerda = this.esquerda.esquerda;

    novaDireita.elemento = this.elemento;
    novaDireita.direita = this.direita;
    novaDireita.esquerda = this.esquerda.direita;

    this.elemento = this.esquerda.elemento;
    this.esquerda = novaEsquerda;
    this.direita = novaDireita;
  }
  private T removeOMaiorElementoDaArvore(ArvoreBuscaBinariaAVL<T> arvore) {

    T maiorElemento;

    if (arvore.ehNodoFolha()) {
      maiorElemento = arvore.elemento;
      arvore.esvazie();
      return maiorElemento;
    }

    if (arvore.direita.elemento != null) return arvore.removeOMaiorElementoDaArvore(arvore.direita);

    maiorElemento = arvore.elemento;
    this.remove(arvore.elemento);

    return maiorElemento;
  }
  private T removeOMenorElementoDaArvore(ArvoreBuscaBinariaAVL<T> arvore) {

    T menorElemento;

    if (arvore.ehNodoFolha()) {
      menorElemento = arvore.elemento;
      arvore.esvazie();
      return menorElemento;
    }

    if (arvore.esquerda.elemento != null)
      return arvore.removeOMenorElementoDaArvore(arvore.esquerda);

    menorElemento = arvore.elemento;
    this.remove(arvore.elemento);

    return menorElemento;
  }