Ejemplo n.º 1
0
/*!
* Remove um determinado dado da árvore
*
* @param dado Dado a ser removido da árvore
* @param arv Árvore a qual será iniciada a busca pelo dado a ser removido
*/
    NoAVL<T>* remover(NoAVL<T>* arv, const T& dado) {
        NoAVL<T>* temporario;
        NoAVL<T>* filho;
        if (arv == NULL) {
            return arv;
        } else if (dado < *(arv->getDado())) {
                arv->esquerda = this->remover(arv->getEsquerda(), dado);
                return balancear(arv);
            } else if (dado > *(arv->getDado())) {
                    arv->direita = this->remover(arv->getDireita(), dado);
                    return balancear(arv);
                } else if (arv->getDireita() != NULL &&
                            arv->getEsquerda() != NULL) {
                        temporario = this->minimo(arv->getDireita());
                        arv->dado = new T(static_cast<T const&>(*(temporario->
                                                                   getDado())));
                        arv->direita = remover(arv->getDireita(),
                                                *(temporario->getDado()));
                        return balancear(arv);
                    } else if (arv->getDireita() != NULL) {
                        filho = arv->getDireita();
                        return balancear(filho);
                        } else if (arv->esquerda != NULL) {
                                filho = arv->getEsquerda();
                                return balancear(filho);
                            }
        delete arv;
        return NULL;
    }
Ejemplo n.º 2
0
/*!
*Realiza uma rotação simples à direita e retorna o resultado da rotação.
* @param nodo O nodo que será rebalanceado.
*/
    NoAVL<T>* simp_roda_dir(NoAVL<T>* nodo) {
        NoAVL<T>* temporario;

        temporario = nodo->getDireita();
        nodo->direita = temporario->getEsquerda();
        temporario->esquerda = nodo;

        this->atualizaAltura(temporario);
        this->atualizaAltura(nodo);
        return temporario;
    }
NoAVL<T>* NoAVL<T>::rotacaoSimplesDireita(NoAVL<T>* X) {
    NoAVL<T>* Y;

    Y = X->getDireita();
    X->direita = Y->getEsquerda();
    Y->esquerda = X;

    this->atualizaAltura(Y);
    this->atualizaAltura(X);

    return Y;
}
Ejemplo n.º 4
0
 NoAVL<T>* inserir(const T& dado, NoAVL<T>* arv) {
   NoAVL<T>* aux;
   if (dado < *arv->getDado()) {
     if (arv->getEsquerda() == NULL) {
       NoAVL<T>* novo = new NoAVL<T>(dado);
       if (novo == NULL)
         throw 20;
       arv->esquerda = novo;
     }
     else {
       aux = arv->inserir(dado, arv->getEsquerda());
       arv = verificarBalanceamento(arv, dado);
       if (arv->getDado() != aux->getDado()) {
         arv->esquerda = aux;
       }
     }
   }
   else {
     if (dado == *arv->getDado())
       throw 20;
     if (arv->getDireita() == NULL) {
       NoAVL<T>* novo = new NoAVL<T>(dado);
       if (novo == NULL)
         throw 20;
       arv->direita = novo;
     }
     else {
       aux = arv->inserir(dado, arv->getDireita());
       arv = verificarBalanceamento(arv, dado);
       if (arv->getDado() != aux->getDado()) {
         arv->direita = aux;
       }
     }
   }
   atualizarAltura(arv);
   return arv;
 }
Ejemplo n.º 5
0
	void atualizaAltura() {
		int altEsq = esquerda ? esquerda->getAltura() : -1;
		int altDir = direita ? direita->getAltura() : -1;

		altura = (altEsq > altDir ? altEsq : altDir) + 1;
	}